A. Tricky Sum

CF 的第一场教育场次是2015年11月13日,准备从第一场教育场开始写A,B,C题
在page13,现在教育场更新到了160

先从A开始刷

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

你可能感兴趣的:(#,CF,div2,A题,算法)