HDU5407 CRB and Candies 数论
2015-08-23 12:57
363 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5407
题目大意:给出一个整数n,我们想知道LCM[ C(n,0),C(n,1),...,C(n,n) ]%mod的值。
分析:对于函数a(n)=LCM[ C(n,0),C(n,1),...,C(n,n) ]和函数b(n)=LCM[ 1,2,3,...,n ],我们有a(n)=b(n)/(n+1)
其中,对于b(n),我们有:b(n)=p*b(n-1)当p是素数且n=p^k时;b(n)=b(n-1)其他情况;证明过程链接
实现代码如下:
题目大意:给出一个整数n,我们想知道LCM[ C(n,0),C(n,1),...,C(n,n) ]%mod的值。
分析:对于函数a(n)=LCM[ C(n,0),C(n,1),...,C(n,n) ]和函数b(n)=LCM[ 1,2,3,...,n ],我们有a(n)=b(n)/(n+1)
其中,对于b(n),我们有:b(n)=p*b(n-1)当p是素数且n=p^k时;b(n)=b(n-1)其他情况;证明过程链接
实现代码如下:
#include <cstdio> using namespace std; typedef long long ll; const int maxn=1e6+5; const int mod=1e9+7; ll f[maxn];//打表纪录函数b(n) ll p[maxn];//p[i]纪录i的最大质因子 bool judge(int x) { int d=p[x]; while(x%d==0&&x>1) x/=d; return x==1; } void init() { for(int i=1;i<maxn;i++) p[i]=i; for(int i=2;i<maxn;i++) if(p[i]==i) for(int j=i+i;j<maxn;j+=i) p[j]=i; f[0]=1; for(int i=1;i<maxn;i++) if(judge(i)) f[i]=f[i-1]*p[i]%mod; else f[i]=f[i-1]; } ll quick_mod(ll a,ll n) { ll ans=1; a%=mod; while(n) { if(n&1) ans=(ans*a)%mod; n>>=1; a=(a*a)%mod; } return ans; } ll inverse(ll x) { return quick_mod(x,mod-2); } void solve(int n) { ll ans=f[n+1]*inverse(n+1)%mod; printf("%lld\n",ans); } int main() { init(); int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); solve(n); } return 0; }
相关文章推荐
- 2000年-2010年各省回族人口增长率
- Ilog、Drools、Jess规则引擎的Rule Language 对比
- CSS盒模型
- 正则表达式整理
- 编写高质量代码改善C#程序的157个建议——建议124:考虑在命名空间中使用复数
- 阿里巴巴2015秋季笔试研发工程师JAVA
- pat(B) 1037. 在霍格沃茨找零钱(水题)
- 笔记本联想(Lenovo)G40-70M加装内存和SSD固态硬盘
- Struts学习之集成Ajax
- 机器学习之特征选择
- 移动开发iOS之如何在UI界面实现视图的交替
- AspectJ在测试中的应用
- 字符串转成整型(int)
- 黑马程序员-------Java笔记--------怎么越过泛型检查
- storm trident merger
- HEX文件格式详解
- 输入三个整数,按从小到大顺序输出,用引用做形参
- Count and Say
- 如何在VC++中使用Windows Forms (VS2012-VS2015)
- 【随便写写】为什么可以O(m)地得到C(n,m)