OJ-Problems-Source/BestCoder/Round-80/1002.cpp
2016-04-16 20:35:46 +08:00

45 lines
920 B
C++

#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
long long q_mul( long long a, long long b, long long mod ) //快速计算 (a*b) % mod
{
long long ans = 0; // 初始化
while(b) //根据b的每一位看加不加当前a
{
if(b & 1) //如果当前位为1
{
b--;
ans =(ans+ a)%mod; //ans+=a
}
b /= 2; //b向前移位
a = (a + a) % mod; //更新a
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long q,p;
scanf("%I64d %I64d",&q,&p);
long long a=q-1;
long long b=q-2;
long long ans;
if(a%2==0)
{
ans=q_mul(a/2,b,p);
}
else
{
ans=q_mul(a,b/2,p);
}
printf("%I64d\n",ans);
}
return 0;
}