
根据定义,不难得出
筛一遍素数之后暴力统计即可
空间不够就压位筛
对于多次询问,观察到的指数均为1
可以求一遍乘积前缀和,将复杂度降为
最重要的是,这题模数是,不是!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
#define LL long long using namespace std; const int N=100000050,M=60; const int mod=100000007; struct {int sz,id;}; LL used[N/M]; int prime[N>>3]; LL cnt=0,n,ans; LL pow(LL a,LL b) { LL ret=1; while (b) { if (b&1) ret=ret*a%mod; a=a*a%mod,b>>=1; } return ret; } node F(int k) {return (node){k/M,k%M?k%M:M};} int main() { scanf("%lld",&n),ans=1; for(int i=2;i<=n;i++) { node x=F(i); if ((used[x.sz]>>x.id)&1^1) prime[++cnt]=i; for(int j=1;j<=cnt;j++) { if ((LL)i*prime[j]>n) break; node w=F(i*prime[j]); used[w.sz]|=1LL<<w.id; if (i%prime[j]==0) break; } } for(int i=cnt,k=1;i>0;i--) { LL x=pow(prime[i],k); while ((LL)x*prime[i]<=n) k++,x*=prime[i]; ans=ans*x%mod; } printf("%lldn",ans); return 0; }
|
近期评论