1. 程式人生 > >51nod 1189 算術基本定理/組合數學

51nod 1189 算術基本定理/組合數學

its .html name 整數 names log tar nan i+1

www.51nod.com/onlineJudge/questionCode.html#!problemId=1189

1189 階乘分數技術分享

題目來源: Spoj 基準時間限制:1 秒 空間限制:131072 KB 分值: 80 難度:5級算法題 技術分享 收藏 技術分享 關註 1/N! = 1/X + 1/Y(0<x<=y),給出N,求滿足條件的整數解的數量。例如:N = 2,1/2 = 1/3 + 1/6,1/2 = 1/4 + 1/4。由於數量可能很大,輸出Mod 10^9 + 7。 Input
輸入一個數N(1 <= N <= 1000000)。
Output
輸出解的數量Mod 10^9 + 7。
Input示例
2
Output示例
2

用到了算術基本定理的性質求解N!所有素因子的個數,和乘法原理計算所有組合。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 LL mod=1e9+7;
 5 int num[1000005];
 6 bool is[1000005];
 7 void init()
 8 {
 9     is[0]=is[1]=1;
10     int m=sqrt(1000000+0.5);
11     for(int i=2;i<=m;++i)
12     {
13         if(!is
[i]){ 14 for(int j=i*i;j<=1000000;j+=i) 15 is[j]=1; 16 } 17 } 18 } 19 int f(int N,int K) 20 { 21 int s=0; 22 while(N){ 23 s+=N/K; 24 N/=K; 25 } 26 return s; 27 } 28 int main() 29 { 30 int N,M,i,j,k,p=0; 31 init(); 32 cin>>N;
33 M=N; 34 for(i=2;i<=M;++i) 35 { 36 if(!is[i]) 37 num[p++]=f(M,i); 38 } 39 LL res=1; 40 for(i=0;i<p;++i) 41 { 42 res=res*(2*num[i]+1)%mod; 43 } 44 res=(res+1)*500000004%mod; 45 cout<<res<<endl; 46 return 0; 47 } 48 49 /* 50 51 公式化簡為 : (X-N!)*(Y-N!)=(N!)2 假設N!=P1a1*P2a2*......*Pnan 52 那麽ans=π(2*ai+1)| 1<=i<=n ,但是要求X<=Y,所以除以二之後向上取整就好了。 53 54 */




51nod 1189 算術基本定理/組合數學