1 条题解
-
0
题解:https://blog.csdn.net/tenkuo/article/details/149963746?spm=1001.2014.3001.5501
代码:
#include<bits/stdc++.h> using namespace std; template<typename T> void qread(T &x){ x=0; int f=1; char c=getchar(); for(; !isdigit(c); c=getchar()) if(c=='-') f=-1; for(; isdigit(c); c=getchar()) x=x*10+(c-'0'); x*=f; } typedef long long LL; const int N=5e7+10; const LL P=1e9+7; LL n, f[N]; //g[i]代表 i里面有多少它最小质因子的幂次(看到后面就懂了) int pr, prime[N], g[N]; bool v[N]; LL q_pow(LL a, LL b){ LL res=1; while(b){ if(b&1) res=res*a%P; a=a*a%P; b/=2; } return res; } void init(){ pr=0; memset(v, 0, sizeof(v)); f[1]=1; //积性函数的 1都得是 1 for(int i=2; i<=N-10; i++){ if(!v[i]){ pr++, prime[pr]=i; f[i]=2*i-1; g[i]=1; } for(int j=1; (j<=pr) && (i*prime[j]<=N-10); j++){ int p=prime[j]; v[i*p]=1; if(i%p==0){ g[i*p]=g[i]+1; //这玩意可不经 mod啊 LL t=q_pow(p, g[i]); f[i*p]=f[i/t]*(f[t]*p%P+(p-1)*t%P)%P; break; } else{ g[i*p]=g[p]; f[i*p]=f[i]*f[p]%P; } } } for(int i=2; i<=N-10; i++){ f[i]=f[i]*f[i-1]%P; } } int main(){ init(); qread(n); printf("%lld\n", f[n]); return 0; }
- 1
信息
- ID
- 515
- 时间
- 3000ms
- 内存
- 1024MiB
- 难度
- 8
- 标签
- 递交数
- 82
- 已通过
- 11
- 上传者