Tricky Sum【數學】CodeForces 598A

q923714892發表於2020-04-06
Description
求和是一種最常見的運算,我們經常做的就是1加到n的和。例如,1加到100的和是5050。但是現在,我們稍微變動一下求和方法,對於屬於2的冪次的數,我們做的是減法,其餘仍舊做加法。例如,當n=4的時候,最後的結果應該是-1-2+3-4=-4,因為1、2、4分別是2的0次方、2的1次方、2的2次方。現在請你來計算t次這樣的運算。

Input
輸入第一行是一個正整數t,表示要進行t次運算。接下來t行,每行一個整數n,表示要按新的求和方法計算1到n的和。

注意:1<=t<=100,1<=n<=10^9。

Output
輸出t組答案,每個答案佔一行。

Sample Input
2
4
1000000000
Sample Output
-4

499999998352516354

#include<cstdio>  
int main()  
{  
    int t,temp;  
    long long n,ans;  
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%lld",&n);  
        ans=(n+1)*n/2;  
        temp=1;  
        while(n)  
        {  
            ans-=2*temp;  
            temp*=2;  
            if(n==1)  
                break;  
            n/=2;  
        }  
        printf("%lld\n",ans);  
    }  
}  


相關文章