C 如何得到模100000007的结果2^100*3^3

C 如何得到模100000007的结果2^100*3^3,c,modulo,C,Modulo,我有一个问题,如何得到(2^100)*(3^5)的模10^9+7的结果?程序将要求用户输入电源(2^a)和3^b,然后,输出将显示2^a*3^b的结果 我试着把所有的大数转换成模,然后乘以模。但是,它不适用于2*100*3^5 #include "stdio.h" int main() { long long int testcase,b,c,N,a; long long int pow2,pow3 = 1; long long int m = 1000000007;

我有一个问题,如何得到(2^100)*(3^5)的模10^9+7的结果?程序将要求用户输入电源(2^a)和3^b,然后,输出将显示2^a*3^b的结果

我试着把所有的大数转换成模,然后乘以模。但是,它不适用于2*100*3^5

#include "stdio.h"

int main()
{
    long long int testcase,b,c,N,a;
    long long int pow2,pow3 = 1;
    long long int m = 1000000007;

    // input the power
    scanf("%lld",&a); getchar();
    scanf("%lld",&b); getchar();

    // power of 2 (2^a)
    for(int i = 1; i <= a; i++){
        pow2 = pow2 * 2;
    }
    // power of 3 (3^b)
    for(int j = 1; j <= b; j++){
        pow3 = pow3 * 3;
    }

    // convert the big numbers into modulo
    long long int i = 1;
    i = (1*pow2) % m ;
    long long int j = 1;
    j = (1*pow3) % m;

    // the result of first modulo times second modulo
    printf("%lld\n", i*j);
    // doesnt work for 2^100 * 3^5

    return 0;
}
#包括“stdio.h”
int main()
{
长整型测试用例,b,c,N,a;
长整型功率2,功率3=1;
长整型m=100000007;
//输入电源
scanf(“%lld”,&a);getchar();
scanf(“%lld”,&b);getchar();
//2的幂(2^a)

对于(int i=1;i首先,
pow2
未初始化,因此行为未定义。如果初始化为
1
,则问题在于2^100不适合
长int
。最好的解决方法是尽可能多地取模

// power of 2 (2^a)
for(int i = 1; i <= a; i++){
    pow2 *= 2;
    pow2 %= m;
}
// power of 3 (3^b)
for(int j = 1; j <= b; j++){
    pow3 *= 3;
    pow3 %= m;
}

pow2
未初始化。但您看到的错误是,在计算幂次时,
pow2
pow3
可能会溢出。请尝试
pow2=(pow2*2)%m;
pow3=(pow3*3)%m
。第三个错误是结果应该是
(pow2*pow3)%m
,而不仅仅是当前的
i*j
。long int可以高达2^63…如果值为2^100,它将overflow@DavidC.Rankin事实并非如此。您可以通过重复平方进行模幂运算。这里的关键是,您可以多次从任何中间产品中获取模
100000007
因此,
2^100*3^3 mod 100000007==(2^50%100000007)*(2^50%100000007)*3^3)%100000007example@PaulHankin真的很管用,谢谢!
printf("%lld\n", i * j % m);