摘要:
题意:同poj 2283 给一个数字n,求n的倍数中,所使用不同数字最少的。例如1223含3个不同数字。如果有多个答案,取最小的。分析:对于任意n,最多两个数字就能组成n的倍数。因为a,aa,aaa……取n+1个,则必有两个模n余数相同,相减即得n的倍数。所以先考虑一个数字的情况,若没有n的倍数,再广搜两个数字。搜的时候要对余数判重,如果出现了相同的余数,则形成了循环。另外搜两个数字的时候,要枚举这两个数字再搜,同时搜10个数字会爆空间。const int M = 170000;int ans[M], pa;int a[M], p;//数字int b[M],pre[M];//余数 前驱int. 阅读全文
摘要:
题意:n种颜色的珠子可组成多少种长度为n的项链?(旋转算一种,不考虑翻转)n<1000000000,结果对p取余,p<30000分析:本题数据规模很大,若枚举旋转的长度会超时。假设旋转 i 步,则循环节个数为gcd( i, n ) (证明在这里) ,循环节长度 L = n / gcd(i, n). 则 L | n,可以枚举L,并计算gcd(i, n) = n / L的 i 的个数。设gcd(i, n) = t, i = kt,n = Lt, gcd(kt, Lt) = t 等价于 gcd(k, L)=1,这样的 k 有φ( L )个, 即 i 有φ( L )个。于是答案为 (1/n 阅读全文
摘要:
题意:用三种颜色的珠子串成长度为N(N<24)的项链,经过旋转和翻转所得的项链视为同一种项链,求共能组成几条不同的项链。分析:1、旋转:置换的个数是n个,第i个置换的循环节个数是gcd(n,i)个。证明:经过 LCM ( i ,n ) / i 次旋转回到自身,循环节的长度是 LCM( i , n ) / i ,n / ( LCM( i , n ) / i )就是循环节的个数,n / ( LCM( i , n ) / i ) = gcd( n , i )2、翻转:找循环节的关键是找对称轴,n要分奇偶性。当n = 2 * k + 1,对称轴就是每个点和圆心的连线,共n条,除了这个点没变,其他 阅读全文
摘要:
题意:给出两个数a和b,求出[a,b]之间,有多少个数为round number。round number的定义:其二进制数中0的数量大于或等于1的个数。分析:设round number有 s 位,则0的个数至少为 c= (s+1)/21. 若a的二进制有pa位,b有pb位,(pa<s<pb),s位的数中,第一位为1,其余s-1位可自由选择,所以有sum = C(s-1,c) +C(s-1,c+1 )+...+C(s-1,s-1 )。2. 和a位数相同且大于a的round number的个数为:将第一个0改为1,则后面的数位自由组合,满足round number条件的话,这个数一定 阅读全文
摘要:
题意:给一个字符串 S,长度<=10,其中的字母按升序排列。长度小的字符串比大的字符串靠前,长度相同按字典序排列,问 S 排第几个。a - 1b - 2...z - 26ab - 27...az - 51bc - 52...vwxyz - 83681分析:字母按升序排列,则选出若干字母,其排列唯一。先求长度len,比它短的字符串有C(26,1) + C(26,2) +...+C(26,len-1) 个。对于长度相同的字符串,设S=“ b d f h t ”,则前四位和 S 相同,最后一位小于 't' 并且大于 'h' 的有C('z'- 阅读全文
摘要:
题意:3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。给出初始状态和目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动方法。poj1077 hdu1043 zoj1217 uva652 sgu139 (15数码)首先,将空格看成数字9,对于任意的布局S,定义perm(S)为从上到下从左到右的一个排列,i的初始位置为(x,y) 目标位置为(x',y'),定义距离dist(i)=|x'-x| + |y'-y|,每移动一个棋子,dist(9)=dist(9)±1,dist( 阅读全文
摘要:
部分转自这里题意:用 a 和 b 组成 n位的数字(1 ≤ n ≤ 106) ,如果各位数字之和仍只由 a 和 b 组成,则记为“good number”,问一共有多少个good number? 最终答案对1000000007(109 + 7)取模。分析:假设有k个a,那么b的个数为n-k , 各位数字之和为 s = k*a+(n-k)*b, 如果s为good number,那么一共有 C(n,k)种方法。C(n,k) = n! / k! / (n-k)! ,加,减,乘的运算可以取余,但是除法不能直接取余,a/b%mod = a*reverse(b)%mod; 所以这里要对k! 和 (n-k. 阅读全文
摘要:
题意:N个开关,改变某开关,与此开关相关联的开关也会改变。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)分析:第i个开关 ai1 *x1+ ai2 *x2+...+ain*xn=bi, 其中当 开关 j 对 开关 i 有影响时,aij= 1,否则aij= 0. 当开关i的状态改变时,bi= 1,否则bi= 0.求自由变元的个数m,方法数为 2^mconst int maxn = 32;int equ, var; // equ个方程 var个变元 增广阵行数为equ 分别为0到equ - 1 列数为var + 1 分. 阅读全文