bzoj 3817: Sum
3817: Sum
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 229 Solved: 128
[Submit][Status][Discuss]
Description
给定正整数N,R。求
Input
第一行一个数 T,表示有 T 组测试数据。
接下来 T 行,每行两个正整数 n,r。
Output
输出 T 行,每行一个整数表示答案。
Sample Input
3
3 5
3 6
3 7
3 5
3 6
3 7
Sample Output
3
1
-1
1
-1
HINT
对于 100% 的数据,满足 n≤10^9,r≤10^4,T≤10^4。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> using namespace std; int n,r,t; double R; int gcd(int x,int y){ if(y==0)return x; return gcd(y,x%y); } int calc(int n,int a,int b,int c){ if(!n)return 0; int Gcd=gcd(a,gcd(b,c));a/=Gcd,b/=Gcd,c/=Gcd; long long m=(1LL*b*R+c)/a,sum=1LL*n*(n+1)/2*m; c-=m*a;m=(1LL*b*R+c)/a*n;sum+=n*m; return sum-calc(m,b*b*r-c*c,a*b,-a*c); } int main(){ freopen("Cola.txt","r",stdin); int T;scanf("%d",&T); while(T--){ scanf("%d%d",&n,&r); R=sqrt(r);t=(int)(R); if(t*t==r)printf("%d\n",t&1?(n&1?-1:0):n); else printf("%d\n",n-2*(calc(n,1,1,0)-2*calc(n,2,1,0))); } return 0; }