P1625求和 giao精大杂烩

\[\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;
}
posted @ 2020-08-14 15:50  INFP  阅读(159)  评论(0编辑  收藏  举报