結果

問題 No.737 PopCount
ユーザー weizen
提出日時 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);
      |         ~~~~~^~~~~~~~~~~

ソースコード

diff #

#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);
}
0