HDU - 5666 Segment (大数位运算)好题_#include


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;
}