1. 程式人生 > >BZOJ2721 Violet5櫻花(數論)

BZOJ2721 Violet5櫻花(數論)

+= || 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櫻花(數論)