题目:这里

题意:在线段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 }

 

posted on 2016-08-12 11:22  蜘蛛侦探  阅读(193)  评论(0编辑  收藏  举报