您有N
个不同的球,编号从1到N
,M
个不同的框编号从1到M
。
输入:
第一行输入包含测试用例T
的数量。之后,下一行T
行包含N
和M
的值。
输出
对于每个测试用例,请打印答案。由于它可能非常大,您应该以模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;
}
答案 0 :(得分:0)
您必须面对integer overflow
问题,这就是您必须得到错误答案的原因。
执行以下步骤来解决此问题。
unsigned long
更改为long long
或unsigned 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;
}