清华集训2014 sum

  • 清华集训2014sum
  • \[∑_{i=1}^{n}(-1)^{⌊i√r⌋}\]
  • 多组询问,\(n\leq 10^9,t\leq 10^4, r\leq 10^4\)
  • 吼题解啊
  • 具体已经讲得很详细了(找了好久才找到的良心题解。)
  • 首先看到向下取整的式子要会拆开。
  • 然后套类欧几里德。
  • 这里的类欧几里德比较简单,因为可以看作是\(y=kx\)的正比例的向下整点。
  • 如果\(k>1\),那么就相当与直接算上面的点,然后把直线砍到\(k\leq 1\)
  • 否则取反函数,相当于减小了\(n\)而增大了\(k\)
  • 这样每次一定会缩小一半的问题规模,复杂度是\(O(logn)\)的。
#include<bits/stdc++.h>
#define R register int
#define ll long long
#define db double
using namespace std;
int T;ll n,r,ans,t;db q;
int gi(){
    R x=0,k=1;char c=getchar();
    while(c!='-'&&(c<'0'||c>'9'))c=getchar();
    if(c=='-')k=-1,c=getchar();
    while(c<='9'&&c>='0')x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return x*k;
}
ll Gcd(ll x,ll y){return y?Gcd(y,x%y):x;}
ll sol(ll a,ll b,ll c,ll n){
    if(n==1)return (a*q+b)/c;
    if(n==0)return 0;
    ll gcd=Gcd(a,Gcd(b,c));
    a/=gcd,b/=gcd,c/=gcd;
    ll k=(a*q+b)/c;
    if(k==0){
        ll m=((a*q+b)/c*n);
        return m*n-sol(a*c,-b*c,a*a*r-b*b,m);
    }
    else return k*(n*(n+1)/2)+sol(a,b-c*k,c,n);
}

void cheat(){
    if(!(t&1))printf("%lld\n",n);
    else if(n&1)puts("-1");
    else puts("0");
}
int main(){
    T=gi();
    while(T--){
        n=gi(),r=gi(),q=sqrt(r),t=q;
        if(t*t==r){cheat();continue;}
        ans=n+4ll*sol(1,0,2,n)-2ll*sol(1,0,1,n);
        printf("%lld\n",ans);
    }
    return 0;
}

转载于:https://www.cnblogs.com/Tyher/p/10089585.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
清华virtuoso是清华大学音乐团队的精英团体,由清华大学音乐学院的学生组成。团队汇集了一批热爱音乐、艺术才华出众的年轻人,他们在音乐演奏方面具有卓越的技巧和天赋。 清华virtuoso重视团队合作,并通过共同演奏音乐来传达情感和表达音乐的美。他们不仅在校园内开展演出活动,还有时会接受国内外的邀请,在国内外的音乐舞台上展示其精湛的音乐才华。 清华virtuoso注重音乐的多样性,他们演奏的曲目包括古典音乐、现代音乐、传统音乐等不同类型的作品。团队成员们能够熟练掌握各种乐器和音乐风格,他们通过音乐表达自我,展现其多样性和灵感。 除了在音乐演出方面,清华virtuoso还通过社会公益活动来巩固其团队精神和社会责任感。他们组织音乐义演、慰问演出等,积极参与公益事业,用音乐为社会公众带来温暖和慰藉。 清华virtuoso是清华大学音乐团队的骄傲,他们代表了清华学子的音乐水平和综合素质。通过这个团队,清华大学为学生提供了一个展示个人才能、培养艺术表达能力的平台,激励着更多的学生学习音乐和艺术。 总之,清华virtuoso是一支充满才华和活力的音乐团队,他们通过音乐表达情感、展现才华,同时还积极参与社会公益活动,为社会带来正能量。他们继承了音乐的传统和坚持,不断创新和突破,为清华大学和全国范围内的音乐事业做出了重要贡献。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值