标签:
题解:给一个线段,让求线段与坐标轴之间空白部分的整数点的个数,很容易找到规律;
x + y < q - 1;
(q - 1)*(q - 1) - (1 + 2 + *** + q - 1);
(q - 1)(q - 2) / 2;
由于q是1e18,P也是1e18,相乘会超ll,所以想到用巧妙的方法把相乘换成相加;思路:把一个数化为二进制,例如3 * 5 = 1(二进制) * 5 + 10(二进制) * 5;具体看代码:
代码:
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; typedef long long LL; LL js(LL x, LL y, LL MOD){ LL ans = 0; while(x){ if(x&1){ ans += y; ans %= MOD; } x >>= 1; y <<= 1; y %= MOD; } return ans; } int main(){ LL P, q; int T; scanf("%d", &T); while(T--){ scanf("%lld%lld", &q, &P); if((q - 1) & 1){ printf("%lld\n", js(q - 1, (q - 2) / 2, P)); } else if((q - 2) & 1){ printf("%lld\n", js(q - 2, (q - 1) / 2, P)); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/5413986.html