题目:这里
题意:在线段x+y=q与坐标轴围成的三角形中,求有多少个坐标为整数的点,答案模上p。
很容易就想到最后答案就是((q-1)*(q-2))/2然后模上p就是了,但是这个数字比较大,相乘会爆long long,于是用二进制的乘法,类似于快速幂,另外注意这个除以2得在
之前就处理了,因为最后答案一定要是个准确的整数。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 typedef long long ll; 8 9 ll jjc(ll x,ll y,ll mod) 10 { 11 ll res=0; 12 for ( ; y>0 ; y>>=1) 13 { 14 if (y&1) res=(res%mod+x%mod)%mod; 15 x=(x%mod+x%mod)%mod; 16 } 17 return res; 18 } 19 20 int main() 21 { 22 int t; 23 scanf("%d",&t); 24 while (t--){ 25 ll q,p; 26 scanf("%I64d%I64d",&q,&p); 27 ll q1=q-1;ll q2=q-2; 28 if (q1&1) q2/=2; 29 else q1/=2; 30 printf("%I64d\n",jjc(q1,q2,p)); 31 } 32 return 0; 33 }