HDU - 5407(规律)
来源:互联网 发布:程序员的样子 编辑:程序博客网 时间:2024/05/29 14:20
本题目的规律就是
记 f[n] = LCM(1, 2, 3, .... n); 那么 ans[ n ] = f[ n+1 ] / (n+1);
所以只需递推计算出f[n] ; 那么结果ans[ n ] = f[ n+1 ]*rev(n+1)%MOD;
看到了递推计算逆元的神代码;在代码的init()里面。
还有f[n] 比f[n-1 ] 大,只有一种情况,f[n]是由某一个素数的幂构成,很好证明。
所以当p^k == n; f[ n ] = f[ n-1 ]*p; 其他 f[ n ] = f[ n-1 ]
#include <cstring>#include <algorithm>#include <cstdio>#include <iostream>#include <cmath>using namespace std;typedef long long ll;const int N = 1e6+10;const ll MOD = 1e9+7;int vis[N];ll rev[N],f[N];void init(){ for(int i=2;i<N;i++) vis[i]=i; int m = sqrt(N+0.5); for(int i=2;i<=m;i++)if(vis[i]==i) for(int j=i*i;j<N;j+=i) vis[j]=i; rev[1] = 1; for (int i = 2; i < N; i++) { rev[i] = (MOD-rev[MOD % i]) * (MOD / i) % MOD; }}int main(){ init(); f[1] = 1; for(int i=2;i<N;i++){ int p=vis[i],ti=i; while(ti%p == 0){ ti/=p; } if(ti == 1) f[i]=(f[i-1]*p)%MOD; else f[i]=f[i-1]; } int T; int n; scanf("%d",&T); while(T--){ scanf("%d",&n); printf("%I64d\n",f[n+1]*rev[n+1]%MOD); } return 0;}
0 0
- HDU - 5407(规律)
- 规律:HDU
- HDU 2582 规律题
- hdu 1597 找规律
- hdu 4342 数学规律
- HDU-1597(找规律)
- hdu 4475 找规律
- hdu 1020 找规律
- hdu 1868 找规律
- hdu 3184 (规律)
- hdu 1210 (规律)
- hdu 1041 找规律
- hdu 4602 找规律
- hdu 4611 模拟+规律
- hdu 4662 找规律
- HDU-4704 找规律
- hdu (找规律)
- hdu 1792规律题
- cocos2d-x源码中的一个BUG
- 树莓派做 wifi 热点
- MySQL数据库事务隔离级别(Transaction Isolation Level)
- spring官网翻译
- TLD(Tracking-Learning-Detection)学习与源码理解之(综合模块)
- HDU - 5407(规律)
- codeforces 571B--Minimization(贪心+dp)
- 枚举
- 疑问句
- ps 图片处理技法 怎样使照片看起来更加清晰
- 白化原理及Matlab实现
- 抽象类(Abstract)和接口的不同点、共同点(Interface)。
- TLD(Tracking-Learning-Detection)学习与源码理解之(分类器)
- 自学QT之QMutableListIterator