1.利用整數唯一分解定理,求(n+1-m) * (n+m)! / ( m! * (n+1)! )
任何正整數都有且只有一種方法寫出其素因子冪相乘的形式。比如18= 2 * 3^2
A=(p1^k1)*(p2^k2)*(p3^k3)*(p4^k4)*......*(pn^kn) pi為素數
還有把階層看作一個數,比m! 怎樣求m!裡面素數2的指數呢?
cnt=0; while(m) { m/=2; cnt+=m; } 就可以了,為什麼呢?考慮m=4,則m!= 4*3*2*1, 第一次m/=2,是計算m!裡面有多少個數能整除2的(有4,2),所以cnt+=2,有兩個數貢獻
了兩個素數2,接下來第二次m/=2,是計算m!裡面有多少個數能整除4的,有1個數又貢獻了一個素數2.
所以先預先篩出最大范圍內的素數,然後考慮每個素數就好了,關鍵是求出整個式子的該素數的指數是多少。
模板:
bool isprime[maxn*2+10];
int prime[maxn*2+10];
int len=0;//素數的個數
int n,m;
void sieve(int n)//篩n以內的素數
{
for(int i=0;i<=n;i++)
isprime[i]=1;
isprime[0]=isprime[1]=0;
for(int i=2;i<=n;i++)
if(isprime[i])
{
prime[len++]=i;
for(int j=2*i;j<=n;j+=i)
isprime[j]=0;
}
}
int cal(int p,int n)//計算n!裡面有多少個p相乘
{
int ans=0;
while(n)
{
n/=p;
ans+=n;
}
return ans;
}
int main()
{
sieve(maxn*2);
long long ans=1;//記得要用long long
cin>>n>>m;
int nm=n+1-m;
for(int i=0;i=mod)
ans%=mod;
}
}
cout<