摘要:题目地址:cf#232#div2#c题目大意:给定正整数n,然后给你n个数,我们只需要这n个数的乘积,然后问可以分解成多少种n个数的乘积形式。实际上就是先进行素因数分解,然后分配这些指数到n各地方去,即是n元不定方程的非负整数解问题。然后就是组合数打表。 用map进行指数统计。其中素数表只用打到10 ^5 到10^6 不超时但是很浪费代码:#include#include#include#includeusing namespace std;const int mod=1000000007;int p[1000005];vector prime;void make_prime(){ ...
阅读全文
摘要:题目地址:http://poj.org/problem?id=1833直接调用stl里面的next_permutation 只要调用了,不管返回什么,都取了下一个排序。 神奇的是,用c++ac,用g++交tle,跪了 ...代码:#include#include#includeusing namespace std;int p[1024];int main(){ int n,k,m; cin>>m; while(cin>>n>>k) { for(int i=0;i<n;i++) scanf("%d",&p[i]); int
阅读全文
摘要:题目地址:http://poj.org/problem?id=3844思路: a[i]+a[i+1]+...+a[j]=s[j]-s[i]; 于是整除等价于 s[i]===s[j] (mod d); 然后统计出现了多少次 c[n][2]就可以了 。 值得注意的是,有可能50000* (50000-1)/2 要用long long每次进入一个新case 后把p 清零,sum【i】表示前i个数的和, 0=#include#includeusing namespace std;int sum[50005];int p[1000000];int main(){int T;cin>>T;in
阅读全文
摘要:题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4030 只要在哪一个状态下是小的那个赢了,游戏就结束。 所以我们考虑最坏的情况,每次都是小的赢,自己变为两倍。想起了之前选拔赛那个两个盒子之间球倒来倒去那个题。当时只要超过1000次就认为进入循环了。 这里计算概率也要分两种情况,进入循环和不进入循环。 不进入循环就会在某一时刻a【k】==b【k】。 意味着会有k+1轮, 对于期望,最后一个不再是(k+1)*0.5^(k+
阅读全文
摘要:题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2662思想: 1 先把每个概率乘起来,然后乘以可充排列的种数。 2 先一开始用(n1+n2+n3+...+nk)! / (n1! *n2! * n3!*...*nk!) 来算,sb了 因为用BigInteger太慢了~ 这个数是可以很大很大的, 50!呀。但是这个数可以拆成组合数的乘积: c[n1+n2+..+nk][n1] *c[n2+n3+..nk][
阅读全文
摘要:题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1592要点:1 结果就是所有数的和(如果小于0,就返回0) 2将所有的数排在圆周上(从a1到an顺时针存放),这样所谓的j,就是向顺时针扫描 不管扫描到哪里扫过的和必须都是正数。 在1和-1数目相等的时候刚好是0个j满足,然后增加一个1时可以用反证法证明恰好存在一个j,用数学归纳法可以证明: 设和为n时,j的个数为f(n),f(n)=n#includeusing namespace std;int main(){ int size; cin>...
阅读全文