Hdu 5407 CRB and Candies (找规律)
2015-08-21 10:07
246 查看
题目链接:
Hdu 5407 CRB and Candies
题目描述:
给出一个数n,求lcm(C(n,0),C[n,1],C[n-2]......C
[n-2],C
[n-1],C
)%(1e9+7)是多少?
解题思路:
刚开始的时候各种开脑洞,然后卡题卡的风生水起。最后就上了数列查询这个神奇的网站,竟然被我找到了!!!!就是把题目上给的问题转化为求lcm(1, 2, 3, 4 ...... n-2, n-1, n, n-1) / (n+1),扎扎就打了两个表一个lcm
,区间[1,n]的最小公倍数,一个C
,代表pow(n, mod-2),每次查询就变成了O(1)。还是依旧卡的飞起(现在想起,心还是好痛),最后发现lcm数组计算的时候由于lcm的性质限制,并不能lcm
=(lcm[n-1]/gcd(lcm[n-1], n)*n)%mod。随后就开始了TLE之旅,然后就在反复计算复杂度,TLE的很迷啊。怎么计算也并不会T啊,最后换了G++就通过了。(扎扎只能说是神题。恩,没错,是神题)
Hdu 5407 CRB and Candies
题目描述:
给出一个数n,求lcm(C(n,0),C[n,1],C[n-2]......C
[n-2],C
[n-1],C
)%(1e9+7)是多少?
解题思路:
刚开始的时候各种开脑洞,然后卡题卡的风生水起。最后就上了数列查询这个神奇的网站,竟然被我找到了!!!!就是把题目上给的问题转化为求lcm(1, 2, 3, 4 ...... n-2, n-1, n, n-1) / (n+1),扎扎就打了两个表一个lcm
,区间[1,n]的最小公倍数,一个C
,代表pow(n, mod-2),每次查询就变成了O(1)。还是依旧卡的飞起(现在想起,心还是好痛),最后发现lcm数组计算的时候由于lcm的性质限制,并不能lcm
=(lcm[n-1]/gcd(lcm[n-1], n)*n)%mod。随后就开始了TLE之旅,然后就在反复计算复杂度,TLE的很迷啊。怎么计算也并不会T啊,最后换了G++就通过了。(扎扎只能说是神题。恩,没错,是神题)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int maxn = 1000005; const int mod = 1000000007; LL lcm[maxn], C[maxn], prim[maxn], cnt; bool mark[maxn]; void isprim () { cnt = 0; for (int i=2; i<maxn; i++) if (mark[i] == false) { prim[cnt++] = i; for (int j=i+i; j<maxn; j+=i) mark[j] = true; } } LL Pow (LL x, LL n) { LL res = 1; while (n) { if (n % 2) res = (res * x) % mod; x = (x * x) % mod; n /= 2; } return res; } void init () { for (int i=1; i<maxn; i++) C[i] = Pow(i, mod-2); isprim(); for (int i=0; i<cnt; i++) { LL x = prim[i]; while (x < maxn) { lcm[x] = prim[i]; x *= prim[i]; } } lcm[0] = 1; for (int i=1; i<maxn; i++) { if (lcm[i] == 0) lcm[i] = 1; lcm[i] = (lcm[i-1] * lcm[i]) % mod; } } int main () { int t, n; init (); scanf ("%d", &t); while (t --) { scanf ("%d", &n); printf ("%lld\n", lcm[n+1] * C[n+1] % mod); } return 0; }
相关文章推荐
- Java之String,StringBuffer,StringBuilder类
- hdu 1863 畅通工程 kruskal || prim
- Spring注解@Component和@resource的使用
- [C++]Rotate Array 旋转数组
- vc mfc 图片存储mssql数据库中及显示
- 对于数据库值为 1 2 3 在页面上需要根据值判断显示登陆账号类型
- codeforces 45G Prime Problem
- Paths on a Grid(简单组合数学)
- 时间序列数据库的秘密(2)——索引
- 一培训机构设计的学习android课程内容:供大家参考
- Paths on a Grid(简单组合数学)
- [置顶] Android开发之动态库调用
- 隐马尔可夫模型的forward算法的c实现
- xml理论学习总结
- 数据挖掘该怎样的学习路线?
- 详解Hibernate中的NoSession问题
- SQL专场
- 如何删掉win8.1我的计算机里的文件夹(by 星空武哥)
- 如何教女朋友一起编程
- 质数环