次のコードを使用して、ビッグモッズの問題を解決しようとしていました。
#include<iostream>
#include<cmath>
using namespace std;
typedef long int li;
li m;
li mod(li b,li p)
{
if(p==0)
return 1;
if(p%2==0)
{
return ((mod(b,p/2)%m)*mod(b,p/2)%m)%m;
//return (li)pow(mod(b,p/2)%m,2)%m;
}
return (b%m*mod(b,p-1)%m)%m;
}
main()
{
li b,p;
while(cin>>b>>p>>m)
{
cout<<mod(b,p)<<endl;
}
}
ただし、 ((mod(b,p/2)%m)*mod(b,p/2)%m)%m と pow(mod(b,p/2)%m,2)% では異なる出力が得られます私が知りたいのは、それらが同じではないか、同じである場合、異なる出力を与える理由です。
サンプル入力: 3 18132 17
17 1765 3
2374859 3029382 36123
pow 関数なしの出力: 13 2 13195
pow 関数での出力: 1 2 31329
pow 関数を使用したテスト コード
#include<iostream>
#include<cmath>
using namespace std;
typedef long int li;
li m;
li mod(li b,li p)
{
if(p==0)
return 1;
if(p%2==0)
{
//return ((mod(b,p/2)%m)*mod(b,p/2)%m)%m;
return (li)pow(mod(b,p/2)%m,2)%m;
}
return (b%m*mod(b,p-1)%m)%m;
}
main()
{
li b,p;
while(cin>>b>>p>>m)
{
cout<<mod(b,p)<<endl;
}
}