P1625求和 giao精大雜燴
阿新 • • 發佈:2020-08-14
\[\sum_{i=1}^n\frac{1}{\prod_{j=i}^{i+m-1}j}=S\\ \frac{0!}{m!}+\frac{1!}{(m+1)!}+...+\frac{(n-1)!}{(m+n-1)!}\\ \frac{0!\frac{(m+n-1)!}{m!}+...(n-1)!\frac{(m+n-1)!}{(m+n-1)!}}{(m+n-1)!} \]
先將分母分解質因數,最後giao精除以低精
#include<cstdio> #include<cstring> #include<vector> using namespace std; inline int max(int a,int b){return a > b ? a : b;} struct INT{ int num[2501],len = 0; INT operator+(INT &x)const{ INT re; memset(re.num,0,sizeof(re.num)); re.len = max(len,x.len); for(int i = 1;i <= re.len;i++) re.num[i] = num[i] + x.num[i]; int jw = 0; for(int i = 1;i <= re.len;i++){ re.num[i] += jw; jw = re.num[i]/10; re.num[i] %= 10; } if(jw) re.num[++re.len] = jw; return re; } INT operator*(int &x)const{ INT re; memset(re.num,0,sizeof(re.num)); re.len = len; for(int i = 1;i <= re.len;i++) re.num[i] = num[i] * x; int jw = 0; for(int i = 1;i <= re.len;i++){ re.num[i] += jw; jw = re.num[i]/10; re.num[i] %= 10; } while(jw){ re.num[++re.len] = jw % 10; jw /= 10; } return re; } bool operator/(const int &x){ INT re; memset(re.num, 0, sizeof(re.num)); re.len = len; int tw=0; for(int i=len; i>=1; i--){ tw = tw * 10 + num[i]; re.num[i] = tw / x; tw %= x; } if(tw) return false;//除不乾淨 while(!re.num[re.len]) re.len--; if(!re.len) re.len++; len = re.len; for(int i=1; i<=re.len; i++) num[i] = re.num[i]; return true; } INT prt(){ for(int i=len; i>=1; i--) putchar(num[i]+'0'); putchar('\n'); } }fz,fm,fztemp; vector<int> zys;//質因數 int n,m; bool isp[1005]; void shai(){ memset(isp,true,sizeof(isp)); isp[0] = isp[1] = false; for(int i = 2;i <= 1000;i++) if(isp[i]) for(int j = i+i;j <= 1000;j += i) isp[j] = false; } inline void makezys(int x){ for(int i=2; i<=x; i++) if(isp[i]) while(x%i==0){ zys.push_back(i); x /= i; } } int main(){ scanf("%d%d",&n,&m); shai(); fztemp.len = fm.len = 1; fztemp.num[1] = fm.num[1] = 1; fz.len = 1; fz.num[1] = 0; for(int i=1; i<=n+m-1; i++) makezys(i); for(int i=m+1; i<=n+m-1; i++) fztemp = fztemp * i;//先處理出0!*(n+m-1)!/m! for(int i=0; i<=n-1; i++){ if(i) fztemp / (m+i); if(i) fztemp = fztemp * i; fz = fz + fztemp; } for(int i=0; i<zys.size(); i++){ if(fz/zys[i]) ; else fm = fm*zys[i];//不可約分 } fz.prt(); fm.prt(); return 0; }