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 ,其他的没啥需要注意的了