CF 的第一场教育场次是2015年11月13日,准备从第一场教育场开始写A,B,C题
在page13,现在教育场更新到了160
先从A开始刷
#include<bits/stdc++.h>
using namespace std;bool check(long long a)
{if(a%2!=0) return false;while(a%2==0){a/=2;}if(a==1) return true;
}int main()
{int t;cin>>t;while(t--){long long n;cin>>n;long long sum=0;for(long long i=1;i<=n;i++){long long temp=i;if(check(temp)) temp=-temp;sum+=temp;}cout<<sum<<endl;}return 0;
}
上面的代码过不了样例,看了下题解,发现李牧意思没有理解错,只是应该是超时了,算了很久才算出答案,而且答案还不对,我用的是最暴力的做法
等差数列求和除以2 ,要是难以整除的话,要怎么考虑
解决了,long long 不会向下取整
#include<bits/stdc++.h>
using namespace std;int main()
{int t;cin>>t;while(t--){long long n;cin>>n;long long sum=(1+n)*n/2;long long pow=1;while(pow<=n){sum-=pow*2;pow*=2;}cout<<sum<<endl;}return 0;
}
首先是等差数列求和,然后是减去所有2的次方,等差数列求和之后要减去两次2的次方,第一次是减去原来的数,第二次是把2的次方变成负数,实现题目的要求,使用long long ,其他的没啥需要注意的了