bzoj 3817: Sum

3817: Sum

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 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

Sample Output

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

 

posted @ 2018-01-09 16:36  Echo宝贝儿  阅读(161)  评论(0编辑  收藏  举报