思路
根据题意可知,没有被吃掉的数<==>具有两个以上不同质因子组成的数
求所有没有被吃掉的数的lcm<==>求每个质因子的个数,然后快速幂,并相乘
当时,组成小于的数为
当时,组成小于的数为通过欧拉筛求出小于的素数
代码
// Problem: 一群小青蛙呱蹦呱蹦呱 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/9981/J // Memory Limit: 2097152 MB // Time Limit: 4000 ms // Powered by CP Editor (https://github.com/cpeditor/cpeditor) #include <bits/stdc++.h> using namespace std; #define pb push_back #define mp(aa,bb) make_pair(aa,bb) #define _for(i,b) for(int i=(0);i<(b);i++) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,b,a) for(int i=(b);i>=(a);i--) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define X first #define Y second #define lowbit(a) (a&(-a)) #define debug(a) cout<<#a<<":"<<a<<"\n" typedef long long ll; typedef pair<int,int> pii; typedef unsigned long long ull; typedef long double ld; const int N=2e8; const int INF=0x3f3f3f3f; const int mod=1e9+7; const double eps=1e-6; const double PI=acos(-1.0); ll n,ans=1; int prime[N],cnt=0; //prime数组存放所以素数,cnt为素数个数 bool st[N]; //false为素数 void get_prime(int n){ for(int i=2;i<=n;i++){ if(!st[i]) prime[cnt++]=i; //把素数i存到prime数组中 for(int j=0;j<cnt&&i*prime[j]<=n;j++){ st[i*prime[j]]=true; //找到的素数的倍数不访问 if(i%prime[j]==0) break; //关键代码 } } } ll fpow(ll a,ll b){ if(mod==1) return 0; ll ans=1%mod; while(b){ if(b&1) ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } ll logx(ll a,ll b){ return log(b)/log(a); } void solve(){ cin>>n; if(n<6){ cout<<"empty\n"; return; } get_prime(n/2); ll k=log2(n/3); ans*=fpow(2,k),ans%=mod; for(int i=1;i<cnt;i++){ int p=prime[i]; k=logx(p,n/2); ans*=fpow(p,k),ans%=mod; } cout<<ans<<"\n"; } int main(){ ios::sync_with_stdio(0);cin.tie(0); // int t;cin>>t;while(t--) solve(); return 0; }