BZOJ2721 Violet5櫻花(數論)
阿新 • • 發佈:2018-09-06
+= || algo ont flag int math ons violet
有(x+y)n!=xy。套路地提出x和y的gcd,設為d,令ad=x,bd=y。則有(a+b)n!=abd。此時d已是和a、b無關的量。由a與b互質,得a+b與ab互質,於是將a+b除過來得n!=abd/(a+b)。d/(a+b)可取的值不受a、b限制,那麽只要滿足ab|n!(a⊥b)就可以了。
將n!分解質因數,答案就很容易統計了。枚舉質數數一下在n!中有幾個即可。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1;c=getchar();} while (c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N 1000010 #define P 1000000007 int n,prime[N],cnt=0,ans=1; bool flag[N]; int main() { #ifndef ONLINE_JUDGE freopen("bzoj2721.in","r",stdin); freopen("bzoj2721.out","w",stdout); const char LL[]="%I64d\n"; #else const char LL[]="%lld\n"; #endif n=read(); flag[1]=1; for (int i=2;i<=n;i++) { if (!flag[i]) prime[++cnt]=i;for (int j=1;j<=cnt&&prime[j]*i<=n;j++) { flag[prime[j]*i]=1; if (i%prime[j]==0) break; } } for (int i=1;i<=cnt;i++) { int w=0; for (int j=n;j;j/=prime[i]) w+=j/prime[i]; ans=1ll*ans*(w<<1|1)%P; } cout<<ans; return 0; }
BZOJ2721 Violet5櫻花(數論)