Sample Output
0
Source
BestCoder Round #80
//题意:方程x+y=q;
告诉你q,然你求这条直线在第一象限有多少个整数坐标,在直线上的不算。
//思路:
很容易找出规律[(q-2)*(q-1)/2]%p,但是因为数太大,所以在大数取余时得用一个技巧,就是把其中一个大数化小,再逐个相乘取余。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define ll __int64
using namespace std;
ll p_mod(ll q1,ll q2,ll p)
{
ll sum=0;
while(q2)
{
if(q2&1)
{
sum+=q1;
sum%=p;
}
q1<<=1;
q1%=p;
q2>>=1;
}
return sum;
}
int main()
{
int t,n,m;
ll p,q;
ll q1,q2,pp;
int i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&q,&p);
q1=q-1;q2=q-2;
if(q1&1)
q2>>=1;
else
q1>>=1;
printf("%lld\n",p_mod(q1,q2,p));
}
return 0;
}