摘要:
在纸上演算一下就能看出答案是:sum{ C(n-1, i) * a[i] / 2^(n-1) | 0 ≤ i≤n-1 }组合数可以通过递推计算:C(n, k) = C(n, k-1) * (n-k-1) / k但是n太大了,直接计算组合数会爆double的。所以计算的时候要取一下对数就行了,组合数对... 阅读全文
摘要:
一个数字能被3整除就等价于这个数的各个数字之和被3整除。所以一开始的时候先要拿一个能使剩下的数字是3的倍数的数。然后就一直拿0、3、6、9直到某人不能再拿为止。 1 #include 2 #include 3 4 const int maxn = 1000 + 10; 5 char s[max... 阅读全文
摘要:
输出第n个回文数。规律就是一位和两位的回文数各有9个,三位四位的回文数各有90个,以此类推。给出n,可以先判定一下第n个回文数的位数,然后后面也不难推,但是有很多细节需要注意。 1 #include 2 #include 3 #include 4 using namespace std; 5 ... 阅读全文
摘要:
n个人里选k个人有C(n, k)中方法,再从里面选一人当队长,有k中方法。所以答案就是第一步的变形只要按照组合数公式展开把n提出来即可。 1 #include 2 3 typedef long long LL; 4 const LL M = 1000000007; 5 6 LL pow(int... 阅读全文
摘要:
n个可重复的元素的排列一共有= All种,其中假设这些数依次为ai,每种数字有mi个。从右往左考虑第d位数(d≥0),第i个数字出现的次数为,那么这个数字对所求答案的贡献为其实可以先一次求出个位上每种数字对答案的贡献,然后乘上 1 #include 2 #include 3 using name... 阅读全文
摘要:
首先有个关键性的结论就是一个数的合数幂就是超级幂。最小的合数是4,所以枚举底数的上限是pow(2^64, 1/4) = 2^16 = 65536对于底数base,指数的上限就是ceil(64*log(2)/log(base)),注意这个上限不能取到,是个开区间 1 #include 2 #incl... 阅读全文
摘要:
我一直相信这道题有十分巧妙的解法的,去搜了好多题解发现有的太过玄妙不能领会。最简单的就是枚举n的所有约数,然后二重循环找lcm(a, b) = n的个数 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int gcd(i... 阅读全文
摘要:
求一个区间的最大连续子序列,基本想法就是分治,这段子序列可能在区间的左半边,也可能在区间的右半边,也有可能是横跨区间中点,这样就是左子区间的最大后缀加上右子区间的最大前缀之和。线段树维护三个信息:区间最大前缀、最大后缀、最大连续子区间的下标。最大前缀可以通过递推来求:要么是左子区间的最大前缀和、要么... 阅读全文
摘要:
求mk整除n!,求k的最大值。现将m分解质因数,比如对于素数p1分解出来的指数为k1,那么n!中能分解出多少个p1出来呢?考虑10!中2的个数c:1~10中有10/2个数是2的倍数,c += 5;1~10中有10/4个数是4的倍数,所以c += 2,其中有10/8 = 1个数是8的倍数,所以c +=... 阅读全文
摘要:
A. Playing with Paper如果a是b的整数倍,那么将得到a/b个正方形,否则的话还会另外得到一个(b, a%b)的长方形。时间复杂度和欧几里得算法一样。 1 #include 2 #include 3 using namespace std; 4 5 //const int m... 阅读全文
摘要:
将K个不超过N的非负整数加起来,使它们的和为N,一共有多少种方法。设d(i, j)表示j个不超过i的非负整数之和为i的方法数。d(i, j) = sum{ d(k, j-1) | 0 ≤ k ≤ i},可以理解为前j-1个数之和为i-k,最后一个数为k还有一种更快的递推办法,把这个问题转化为将N个小... 阅读全文
摘要:
好吧,被大白书上的入门题给卡了。=_=||已知LCM(A, B) = C,已知A和C,求最小的B一开始我想当然地以为B = C / A,后来发现这时候的B不一定满足gcd(A, B) = 1A要不断地除去gcd(A, B),直到满足gcd(A, B) = 1B最后就应该乘上A除去的值 1 #incl... 阅读全文
摘要:
范围最值问题,O(nlogn)的预处理,O(1)的查询。这个题就是先对这些数列进行游程编码,重复的元素只记录下重复的次数。对于所查询的[L, R]如果它完全覆盖了某些连续的重复片段,那么查询的就是这几种元素重复最多的次数,也就是RMQ。如果[L, R]还覆盖了某一部分边界,也要单独计算取最大值。还有... 阅读全文
摘要:
第一次写树状数组,感觉那个lowbit位运算用的相当厉害。因为-x相当于把x的二进制位取反然后整体再加上1,所以最右边的一个1以及末尾的0,取反加一以后不变。比如1000取反是0111加一得到1000,这样与运算以后不变最右边的1左边部分取反,加一不会影响左半部分,所以与运算以后全部为0对于这道题来... 阅读全文
摘要:
考虑一个简单的问题,两个长度为n的有序数组A和B,从每个数组中各选出一个数相加,共n2中情况,求最小的n个数。将这n2个数拆成n个有序表:A1+B1≤A1+B2≤...A2+B1≤A2+B2≤......An+B1≤An+B2≤...然后用优先队列合并成一个有序表即可。队列中需要记录两个数的和s,以... 阅读全文
摘要:
将多个有序表合并成一个有序表就是多路归并问题,可用优先队列来解决。 1 #include 2 #include 3 using namespace std; 4 5 const int maxn = 1000 + 10; 6 7 struct Node 8 { 9 int time,... 阅读全文
摘要:
水题。给出一个数列,求第k个值为v的数字的位置。熟练使用STL还是很有必要的,尤其是CF的Div用map用得挺多的。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 void scan(int& x) 7 { 8 ... 阅读全文
摘要:
做道水题凑凑题量,=_=||。直接用STL里的queue、stack 和 priority_queue模拟就好了,看看取出的元素是否和输入中的相等,注意在此之前要判断一下是否非空。 1 #include 2 using namespace std; 3 4 void scan( int &x )... 阅读全文
摘要:
桥的间隔数为n = ceil(B/D),每段绳子的长度为L / n,相邻两塔之间的距离为 B / n主要问题还是在于已知抛物线的开口宽度w 和 抛物线的高度h 求抛物线的长度弧长积分公式为:设抛物线方程为f(x) = ax2,则这段抛物线弧长为查积分表或者自己分部积分算一下:二分抛物线高度x,使得每... 阅读全文
摘要:
给出的曲线要么是开口向上的抛物线要么是直线,但所定义的F(x)的图形一定是下凸的。注意一点就是求得是极小值,而不是横坐标,样例也很容易误导人。 1 #include 2 #include 3 using namespace std; 4 5 const int maxn = 10000 + 1... 阅读全文