Segment
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1803 Accepted Submission(s): 664
Problem Description
Input
q
Output
Sample Input
1 2 107
Sample Output
0
Source
直线x+y=q与坐标轴围成的三角形区域内有多少个整数点,x=1时,有q-2个整数点,x=2时,有q-3个.......以此类推最后有1个,所以一共有(q-2)*(q-1)/2个整数点
直接算会超时,所以用快乘法
code:
#include<cstdio>
#include<algorithm>
using namespace std;
long long kuaicheng(long long a,long long b,long long p){//计算a*b%p 快乘
long long ans=0;
while(b){
if(b%2!=0) ans=(ans+a)%p;
a=(2*a)%p;
b=b/2;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
long long n,p;
scanf("%lld%lld",&n,&p);
long long sum;
if((n-1)%2==0)//为偶数
sum=kuaicheng((n-1)/2%p,(n-2)%p,p);
else
sum=kuaicheng((n-1)%p,(n-2)/2%p,p);
printf("%lld\n",sum%p);
}
return 0;}