結果
| 問題 | 
                            No.737 PopCount
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2018-09-28 23:15:33 | 
| 言語 | C++11(廃止可能性あり)  (gcc 13.3.0)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,230 bytes | 
| コンパイル時間 | 470 ms | 
| コンパイル使用メモリ | 30,464 KB | 
| 実行使用メモリ | 5,248 KB | 
| 最終ジャッジ日時 | 2024-10-12 07:20:33 | 
| 合計ジャッジ時間 | 851 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 WA * 1 | 
| other | AC * 1 WA * 14 | 
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:8:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
    8 |         scanf("%lld",&N);
      |         ~~~~~^~~~~~~~~~~
            
            ソースコード
#include <stdio.h>
#include <math.h>
typedef long long ll;
ll MOD = 1000000007;
int main(){
        ll N;
        scanf("%lld",&N);
        int keta = 1;
        ll pow2 = 2;
        while(pow2 < N){
                keta++;
                pow2 *= 2;
        }
        ll ans = 0;
        for(int n = 1; n <= keta; n++){
                ll k = 1;
                for(int j = 1; j < n; j++) k *= 2LL;
                ll origK = k;
                ll x = N/(2LL*origK);
                k %= MOD;
                ll k2 = k*k;
                k2 %= MOD;
                ll tmp = ((3*k2-k)/2+k2*(x-1));
                tmp %= MOD;
                ans += x* tmp;
                ans %= MOD;
                
                if(N >= 2*origK*x+origK){
                        ll tmp1 = ((2*k*x+k)+(N));
                        if(tmp1 % 2 == 0) tmp1 /= 2;
                        tmp1 %= MOD;
                        ll tmp2 = (N-(2*k*x+k)+1);
                        if(tmp2 % 2 == 0) tmp2 /= 2;
                        tmp2 %= MOD;
                        ans += tmp1*tmp2;
                }
                ans %= MOD;
                //printf("k = %lld, x = %lld, ans = %lld\n",k,x,ans);
        }
        printf("%lld\n",ans);
}