题目大意:给定正整数N,R;求 ∑d=1n(−1)⌊d×r×d⌋
题解:膜CA
我的收获:经典套路
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int T;
ll n,r;
double t;
inline ll calc(ll n,ll a,ll b,ll c){
if(!n) return 0;
ll g=__gcd(__gcd(a,b),c);a/=g,b/=g,c/=g;
ll k=(t*b+c)/a,ret=n*(n+1)/2*k;
c-=k*a;k=(t*b+c)/a*n;
return ret+n*k-calc(k,b*b*r-c*c,a*b,-a*c);
}
void work()
{
scanf("%lld%lld",&n,&r);t=sqrt(r);
if((ll)t==t) printf("%d\n",(r&1)?((n&1)?-1:0):n);
else printf("%lld\n",n+(calc(n,2,1,0)<<2)-(calc(n,1,1,0)<<1));
}
int main()
{
scanf("%d",&T);
while(T--) work();
return 0;
}