Nowcoder9981J.一群小青蛙呱蹦呱蹦呱(线性筛素数)
链接:https://ac.nowcoder.com/acm/contest/9981/J
来源:牛客网
有n个格子,每个格子里有一个数,1,2,3,4...n
牛牛放出无穷只青蛙。
第一只青蛙的路线是:1->2->4->8->16->....
第二只青蛙的路线是:1->3->9->27->81->....
第三只青蛙的路线是:1->5->25->125....
第四只青蛙的路线是:1->7->49........
。。。。。。
用数学语言描述,第 只青蛙的路线是首项为1,公比为的等比数列,其中代表第个素数。
当青蛙跳到一个格子上,如果这个格子上面有一个数,青蛙就会把这个数吃掉。
牛牛想知道,所有没有被吃掉的数的lcm(最小公倍数 ,Least common multiple)是多少?
由于这个lcm可能非常大,请输出它对取模的值。
#include<bits/stdc++.h> using namespace std; const int maxn=1e8+100; const int mod=1e9+7; typedef long long ll; int is[maxn]; int pr[maxn],tot; int n; int main () { scanf("%d",&n); if (n<=5) { printf("empty\n"); return 0; } for (int i=1;i<=n/2;i++) is[i]=1; is[1]=0; for (int i=2;i<=n/2;i++) { if (is[i]) pr[tot++]=i; for (int j=0;j<tot&&1ll*i*pr[j]<=n/2;j++) { is[i*pr[j]]=0; if (i%pr[j]==0) break; } } long long ans=2; while (1) { if (ans*2>n/3) break; ans*=2; } ans%=mod; for (int i=0;i<tot;i++) { int x=pr[i]; if (x==2) continue; int tt=x; while (1) { if (1ll*tt*x>n/2) break; tt*=x; } ans*=tt; ans%=mod; } printf("%lld\n",ans); }