嗨,我在代码sprint5问题中实现nCr MODm时遇到问题。
链接到问题是......
https://www.hackerrank.com/contests/codesprint5/challenges/matrix-tracing
我所学到的是我可以将算数运算的规则应用于阶乘计算和逆阶阶乘计算以及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;
}

最佳答案

最终,我的代码中出现了错误。

错误...

  • 我应该使用常量变量mdco为unsigned long long
    int而不是int
  • 第二个错误是计算pow(a,b) % md中的pow() .....的算法
    函数,我应该先做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;
    }
    

    关于c++ - nCr和反阶乘(MODm)的实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21279116/

    10-13 03:40