一群小青蛙呱蹦呱蹦呱
青蛙不会踩到的数一定是由两种以上质因子的,我们用p1-pn表示不同的质因子,那么这些不会踩到的数就可以表示为p1^a1 * p2^b1 或者 p1^a2 * p2^b2 p3^c1 等等
要对这些数求lcm,我们假设只存在两个不会踩到的数,分别为 p1^a2 * p2^b2 *p3^c2 和p1^a1 * p2^b1 *p3^c1 ,那么他们的lcm 就是p1^(max(a1,a2)) *p2^(max(b1,b2)) *p3(max(c1,c2)) ,所有对于不同的数,我们只需要求出每个质因子的最高次数即可。对于2这个质因子,如果一个数存在不只2这个质因子,而且要让2出现的次数最多,那么这个数就要满足2^k3<=n 只有2 和 3 这两个质因子的话,2出现的次数才可能更多,再多出一个质因子,2出现的次数就会减少。对于大于2的质因子要想让他们出现的次数多,假设这个数是x,那么需要满足 x^k*2<=n,因为2是最小的质因数,让x *2就是为了让x 出现的次数尽可能的多
#include<bits/stdc++.h> using namespace std; const long long mod=1e9+7; int temp[10000000]; bool arr[80000100]; int cnt=0; int n; long long kum(int x,int y){ long long res=1; long long t=x; while(y){ if(y&1){ res=t*res%mod; } t=t*t%mod; y>>=1; } return res; } long long cal(int x){ if(x==2) return kum(2,floor(log(n/3)/log(2))); else return kum(x,floor(log(n/2)/log(x))); } int main(){ cin>>n; long long ans=1; memset(arr,1,sizeof(arr)); for(int i=2;i<=n/2;i++){ if(arr[i]){ temp[cnt++]=i; ans=(ans*cal(i))%mod; } for(int j=0;j<cnt&&i*temp[j]<=n/2;j++){ arr[i*temp[j]]=0; if(i%temp[j]==0)break; } } if(ans==1)cout<<"empty"; else cout<<ans; return 0; }
题解汇总 文章被收录于专栏
无