C++ 超大数nCr和逆阶乘(MODm)的实现

C++ 超大数nCr和逆阶乘(MODm)的实现,c++,dynamic,modular-arithmetic,ncr,C++,Dynamic,Modular Arithmetic,Ncr,嗨,我在代码sprint5中实现nCr MODm时遇到问题。 与问题相关的是。。。。。。 . 我学到的是,我可以将mudular算术规则应用于阶乘计算和逆阶乘计算,也可以应用于pow(a,b)MODm计算。但我不知道我遗漏了什么,这导致了错误的答案。 这是我目前的代码 #include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algor

嗨,我在代码sprint5中实现nCr MODm时遇到问题。 与问题相关的是。。。。。。 . 我学到的是,我可以将mudular算术规则应用于阶乘计算和逆阶乘计算,也可以应用于pow(a,b)MODm计算。但我不知道我遗漏了什么,这导致了错误的答案。 这是我目前的代码

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <map>
#include<math.h>
using namespace std;
const int md = 1000000007;
const int co = 2000020;
unsigned long long int ft[co];

long long int fact(unsigned long long int n)
{   
   return ft[n];
}

void fct(){
    ft[1]=1;
    for(unsigned long long int i = 2;i<=2000020;i++){
        ft[i]=(i*ft[i-1]) % md;
        }
    }

long long int pow(long long int x, long long int n, long long int mod){
    long long int result=1; 
    while(n>0){
        if(n%2 ==1){
            result = (result*x) % mod;
        }
        n= n>>1;
        x= (x*x)% mod;  
    }
    return result;
}

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */  
    unsigned long long int m , n;
    long long result;
    int T;
    fct();
    cin>>T;
    while(T--){
        cin>>m>>n; 
        unsigned long long int mod = md-2;
         result = (fact(m+n-2) * pow( ( fact(m-1) * fact(n-1) ) , mod, md )) % md ;
        cout<<result<<endl;
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
常数int md=100000007;
常数int co=2000020;
无符号长整型ft[co];
长整型事实(无符号长整型n)
{   
返回ft[n];
}
void fct(){
ft[1]=1;
for(无符号长整型i=2;i0){
如果(n%2==1){
结果=(结果*x)%mod;
}
n=n>>1;
x=(x*x)%mod;
}
返回结果;
}
int main(){
/*在此处输入代码。从标准输入读取输入。将输出打印到标准输出*/
无符号长整型m,n;
长期结果;
int T;
fct();
cin>>T;
而(T--){
cin>>m>>n;
无符号长整型模=md-2;
结果=(事实(m+n-2)*pow((事实(m-1)*事实(n-1)),mod,md))%md;

最后我得到了代码中的错误

错误

  • 我应该使用常量变量
    md
    co
    作为无符号long int而不是仅int
  • 第二个错误是在
    pow()中计算
    pow(a,b)%md的算法中
    函数,我应该先执行
    x%md
    ,然后再进一步处理 因为传递x的概率大于
    md
  • 当前工作代码为

    #include <cmath>
    #include <cstdio>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <map>
    #include<math.h>
    using namespace std;
    const unsigned long long int md = 1000000007; 
    const unsigned long long int co = 2000020;
    unsigned long long int ft[co];
    
    unsigned long long int fact(unsigned long long int n)
    {   
        return ft[n];
    }
    
    void fct(){
        ft[0]=1;
        for(unsigned long long int i = 1;i<=2000020;i++){
            ft[i]=(i*ft[i-1]) % md;
        }
    }
    
    unsigned long long int pow(unsigned long long int x, unsigned long long int n, unsigned long long int mod){
        unsigned long long int result=1; 
        x = x % md;
        while(n>0){
            if(n%2 ==1){
                result = (result*x) % md;
            }
            n= n>>1;
            x= (x*x)% md;   
        }
        return result;
    }
    
    int main() {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT */  
        unsigned long long int m , n;
        unsigned long long int result;
        int T;
        fct();
        cin>>T;
        while(T--){
            cin>>m>>n; 
            unsigned long long int mod = md-2;   
            result = (fact(m+n-2) * pow( ( fact(m-1) * fact(n-1) ) , mod, md )) % md ;
            cout<<result<<endl; 
        }
    
        return 0;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    使用名称空间std;
    常量无符号长整型md=100000007;
    常数无符号长整型系数co=2000020;
    无符号长整型ft[co];
    无符号长整型事实(无符号长整型n)
    {   
    返回ft[n];
    }
    void fct(){
    ft[0]=1;
    for(无符号长整型i=1;i0){
    如果(n%2==1){
    结果=(结果*x)%md;
    }
    n=n>>1;
    x=(x*x)%md;
    }
    返回结果;
    }
    int main(){
    /*在此处输入代码。从标准输入读取输入。将输出打印到标准输出*/
    无符号长整型m,n;
    无符号长整型结果;
    int T;
    fct();
    cin>>T;
    而(T--){
    cin>>m>>n;
    无符号长整型模=md-2;
    结果=(事实(m+n-2)*pow((事实(m-1)*事实(n-1)),mod,md))%md;
    
    coutYour
    fact
    函数在第一行返回,因此大部分不会执行。不,这只是fct()函数,它只是预计算将来需要的阶乘。那么为什么
    fact
    中的所有代码都在那里?如果不打算执行,请将其从问题中删除。实际上,fact函数从ft[]中获取值数组,该数组已经由fct()计算。这是因为我在需要时尝试了这两种计算方法,然后替换为预计算……它工作得更快