数论 - Funny scales(SPOJ - SCALE)

Funny scales

Problem‘s Link

----------------------------------------------------------------------------

Mean:

给定两个数n和x,有一个天平,初始时左盘为x,你需要从以下集合中选一些数字来放到两个盘中,使得两个盘相等(note:每个数字只能取一次)。

analyse:

即:

将X化为3进制:

但是题目说每个3^i必须为1,所以我们需要将X表示成的等式的每一项的系数变为1,这就是本题的关键。

方法:

  • 将X化为3进制的过程中,每一项的集合为{0,1,2} ,当遇到2时,将2表示成3-1的形式,即:向前进移位,本位置位-1。

如此一来便很好的处理了系数重复的问题,而且最后统计答案时,根据系数的符号来划分集合即可。

Time complexity: O(N)

view code

#include <cstdio>
const int MAXL = 100;

int N, X;
int A[MAXL], lenA;
int B[MAXL], lenB;
int dig[MAXL];

int main()
{

scanf( "%d %d", &N, &X );

for ( int i = 0; X != 0; i++ )
   {
       dig[i] += X % 3;
       if ( dig[i] > 1 )
       {
           dig[i + 1]++;
           dig[i] = dig[i] - 3;
       }
       X /= 3;
   }

for ( int i = MAXL - 1; i >= 0; i-- )
   if ( dig[i] != 0 )
       if ( dig[i] == -1 )
           A[lenA++] = i + 1;
       else if ( dig[i] == +1 )
           B[lenB++] = i + 1;

if ( A[0] > N || B[0] > N )
       printf( "-1\n" );
   else
   {
       for ( int i = lenA - 1; i >= 0; i-- )
       printf( i ? "%d " : "%d", A[i] );
       printf( "\n" );
       for ( int i = lenB - 1; i >= 0; i-- )
       printf( i ? "%d " : "%d", B[i] );
       printf( "\n" );
   }
   return 0;
}

时间: 2024-10-20 02:16:48

数论 - Funny scales(SPOJ - SCALE)的相关文章

hog源码分析

http://www.cnblogs.com/tornadomeet/archive/2012/08/15/2640754.html 在博客目标检测学习_1(用opencv自带hog实现行人检测) 中已经使用了opencv自带的函数detectMultiScale()实现了对行人的检测,当然了,该算法采用的是hog算法,那么hog算法是怎样实现的呢?这一节就来简单分析一下opencv中自带 hog源码. 网上也有不少网友对opencv中的hog源码进行了分析,很不错,看了很有收获.比如: htt

用caffe一步一步实现人脸检测

学习深度学习已有一段时间了,总想着拿它做点什么,今天终于完成了一个基于caffe的人脸检测,这篇博文将告诉你怎样通过caffe一步步实现人脸检测.本文主要参考唐宇迪老师的教程,在这里感谢老师的辛勤付出. 传统机器学习方法实现人脸检测: 人脸检测在opencv中已经帮我们实现了,我们要把它玩起来很简单,只需要简简单单的几行代码其实就可以搞定.(haarcascade_frontalface_alt.xml这个文件在opencv的安装目录下能找到,笔者的路径是:E:\opencv2.4.10\ope

YOLO配置文件理解

[net] batch=64 每batch个样本更新一次参数. subdivisions=8 如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batch/subdivisions. 在darknet代码中,会将batch/subdivisions命名为batch. height=416 input图像的高 width=416 Input图像的宽 channels=3 Input图像的通道数 momentum=0.9 动量 decay=0.0005

『Caffe』图像检测程序(待续)

和图像分类不同,图像检测涉及更多的技术基础,本程序是基于传统的滑窗模式完成检测,当下已经有了最新的基于caffe的RCNN.Fast-RCNN.Faster-RCNN以及SSD框架 ,个中思路不同,不得叹惋前路漫漫.由于接触本部时走了很多弯路,所以给出几个关键词用于学习滑窗检测理论基础学习:overfeat:全卷积网络:图像金字塔:非极大值抑制,当然了,传统的卷积分类网络也要了解. 程序调用逻辑图如下: 库导入以及参数设置部分: 1 # coding=utf-8 2 import numpy a

caffe_实战之两个简单的例子(物体分类和人脸检测)

一.物体分类: 这里使用的是caffe官网中自带的例子,我这里主要是对代码的解释~ 首先导入一些必要的库: import caffe import numpy as np import matplotlib.pyplot as plt %matplotlib inline plt.rcParams['figure.figsize'] = (10 , 10) #显示图像的最大范围,使用plt.rcParams['savefig.dpi']得到缺省的dpi值为100,则最大的图片范围为1000*10

BZOJ 2226: [Spoj 5971] LCMSum( 数论 )

∑lcm(i,n) = ∑ i*n/(i,n) = ∑d|n∑(x,n)=d x*n/d = ∑d|n∑(t,n/d)=1t*n = n∑d|nf(d). f(d)表示1~d中与d互质的数的和, 即f(d) = d*φ(d)/2(d>=2). 然后O(n)筛φ, 每次询问暴力算即可...最大是100w,sqrt(100w)=1000内的质数是168个, 所以复杂度是O(n + T*168), 可以AC  ----------------------------------------------

[SPOJ VLATTICE]Visible Lattice Points 数论 莫比乌斯反演

7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many lattice points are visible from corner at (0,0,0) ? A point X is visible from point Y iff no other lat

SPOJ - LOCKER 数论 贪心

题意:求出\(n\)拆分成若干个数使其连乘最大的值 本题是之江学院网络赛的原题,计算规模大一点,看到EMAXX推荐就做了 忘了大一那会是怎么用均值不等式推出结果的(还给老师系列) 结论倒还记得:贪心分解3,不够就用2凑 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #

SPOJ - POLYNOM Polynomial(数论乱搞)题解

题意 :给你n个数,问你是否存在一个多项式(最多三次方)满足f(i)= xi. 思路:讲一个神奇的思路: x3 - (x - 1)3 = 3x2 - 3x + 1 x2 - (x - 1)2 = 2x + 1 x - (x - 1) = 1 1 - 1 = 0 看了上面这么多,其实已经可以发现一件事情了:如果相邻常数减一次那么就是0:相邻一次式减一次降为常数,减两次为0:相邻二次式减一次降为一次式,减两次降为常数,减三次.... 由此我们可以知道,如果存在一个多项式(最多三次方)满足f(i)=