直接上快速幂就好了。只不过中间竟然有值爆long long了,余数p的范围是9999999967,那么在快速幂中就有可能有两个小于p的值相乘,达到接近10^20这么大。而long long的最小值为-9223372036854775808,最大值为9223372036854775808,接近10^19,显然不够。unsigned long long是无符号的,最大值为18446744073709551615,接近2*10^19,显然也不够(额,一想想,无符号果然是有符号的整型的两倍啊,怪不得unsigned long long会超)。这时候只能使用__int128这种神奇的大整型了,经测试,__int128可输入输出至多38位的数字。
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll mod=9999999967;
ll ksm(ll a,ll n)
{
__int128 b=a;
__int128 res=1;
while(n)
{
if(n&1) res=res*b%mod;
b=b*b%mod;
n>>=1;
}
return res;
}
int main()
{
int t;
cin>>t;
while(t--)
{
ll x,k;
scanf("%lld%lld",&x,&k);
printf("%lld\n",ksm(x,k));
}
return 0;
}