高精度算法_求组和

题目原型是洛谷的P1771

#include<bits/stdc++.h>
using namespace std;
int k,x;
int a[100];
int ans;
int ksm(int b,int p,int k){        //快速幂 
    ans=1;
    while(p){
        if(p&1) ans=ans*b%k;
        b=b*b%k,p>>=1;
    }
    return ans;
    
}
void p(){
    for(int i=a[0];i>=1;i--)
     cout<<a[i];
}
void comb(int r,int n){
    a[0]=1;
    a[1]=1;
    for(int i=r+1;i<=n;i++){      //求 (r+1)...(n) 
        for(int j=1;j<=a[0];j++)
         a[j]*=i;
         int tmp=0;
        for(int j=1;j<=a[0];j++){
            tmp+=a[j];
            a[j]=tmp%10;
            tmp/=10;
        }
        while(tmp){
            a[++a[0]]=tmp%10;
            tmp/=10;
        }
    }
    for(int i=2;i<=n-r;i++){       //模仿竖式除法 除以 (n-r)! 
        int tmp=0;
        for(int j=a[0];j>=1;j--){
            tmp*=10;
            tmp+=a[j];
            a[j]=0;
            if(tmp>i){
                a[j]=tmp/i;
                tmp%=i;
            }
        }
    while(a[a[0]]==0) a[0]--;
    }
}
int main(){
    cin>>k>>x;
    x%=1000;
    x=ksm(x,x,1000)-1;
    comb(k-1,x);
    p();
    return 0;
} 
原文地址:https://www.cnblogs.com/uncklesam7/p/9757620.html