找出N个球可以放在M盒中的方式

时间:2016-02-08 02:40:25

标签: c++ algorithm

您有N个不同的球,编号从1到NM个不同的框编号从1到M

输入:

第一行输入包含测试用例T的数量。之后,下一行T行包含NM的值。

输出

对于每个测试用例,请打印答案。由于它可能非常大,您应该以模10^9 + 7模式打印它。

我尝试了以下代码,但它出错:

#include<iostream>
#include<cmath>
#include<math.h>
using namespace std;
int main()
{
    unsigned short int T;
    unsigned long int N,M;
    cin>>T;
    for (int i = 0; i < T; i++)
    {
        cin>>N>>M;
        long int res;
        res=  pow(M,N);
            int c=0;
            c=pow(10,9);
            res=res%(c + 7);
        cout<<res<<endl;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您必须面对integer overflow问题,这就是您必须得到错误答案的原因。

执行以下步骤来解决此问题。

  • unsigned long更改为long longunsigned long long。 (为什么?想想)。
  • 使用对数用户定义函数计算res = pow(M,N)的值以及并排的模数考虑因素。这将提升您的计划。

请参阅我的代码段以查看要进行的更改:

#include<iostream>
#define MOD 1000000007

int main() {
    unsigned short int T;
    unsigned long long N , M , result;
    unsigned long long power(unsigned long long, unsigned long long); /*prototype of power*/

    std::cin>>T;
    for (int i = 0; i < T; i++) {
        std::cin >> N >> M;
        result = power(M , N);
        std::cout << result << std::endl;
    }

    return 0;
}

unsigned long long power(unsigned long long M, unsigned long long N) {
    if(N == 0) {
        return 1;   
    }

    unsigned long long result = power(M , N/2);
    result = (result * result) % MOD;

    if(N%2 == 1) {
        result = (result * M) % MOD;   
    }

    return result;
}