結果

問題 No.737 PopCount
ユーザー mugen_1337
提出日時 2020-06-25 21:10:49
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 8 ms / 1,000 ms
コード長 3,167 bytes
コンパイル時間 4,454 ms
コンパイル使用メモリ 198,680 KB
最終ジャッジ日時 2025-01-11 10:22:51
ジャッジサーバーID
(参考情報)
judge1 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 15
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include<bits/stdc++.h>
using namespace std;
#define ALL(x) x.begin(),x.end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define debug(v) cout<<#v<<":";for(auto x:v){cout<<x<<' ';}cout<<endl;
#define INF 1000000000
#define mod 1000000007
using ll=long long;
const ll LINF=1001002003004005006ll;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;}
template<class T>bool chmin(T &a,const T &b){if(b<a){a=b;return true;}return false;}
template<ll Mod>
struct ModInt{
long long x;
ModInt():x(0){}
ModInt(long long y):x(y>=0?y%Mod:(Mod-(-y)%Mod)%Mod){}
ModInt &operator+=(const ModInt &p){
if((x+=p.x)>=Mod) x-=Mod;
return *this;
}
ModInt &operator-=(const ModInt &p){
if((x+=Mod-p.x)>=Mod)x-=Mod;
return *this;
}
ModInt &operator*=(const ModInt &p){
x=(int)(1ll*x*p.x%Mod);
return *this;
}
ModInt &operator/=(const ModInt &p){
(*this)*=p.inverse();
return *this;
}
ModInt operator-()const{return ModInt(x);}
ModInt operator+(const ModInt &p)const{return ModInt(*this)+=p;}
ModInt operator-(const ModInt &p)const{return ModInt(*this)-=p;}
ModInt operator*(const ModInt &p)const{return ModInt(*this)*=p;}
ModInt operator/(const ModInt &p)const{return ModInt(*this)/=p;}
ModInt operator==(const ModInt &p)const{return x==p.x;}
ModInt operator!=(const ModInt &p)const{return x!=p.x;}
ModInt inverse()const{
int a=x,b=Mod,u=1,v=0,t;
while(b>0){
t=a/b;
swap(a-=t*b,b);swap(u-=t*v,v);
}
return ModInt(u);
}
ModInt pow(long long n)const{
ModInt ret(1),mul(x);
while(n>0){
if(n&1) ret*=mul;
mul*=mul;n>>=1;
}
return ret;
}
friend ostream &operator<<(ostream &os,const ModInt &p){return os<<p.x;}
friend istream &operator>>(istream &is,ModInt &a){long long t;is>>t;a=ModInt<Mod>(t);return (is);}
static int get_mod(){return Mod;}
};
using mint=ModInt<mod>;
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
ll num;cin>>num;
vector<int> s;
vector<mint> base;
for(mint b=1;num;b*=mint(2)){
s.push_back(num%2);
num/=2;
base.push_back(b);
}
int n=(int)s.size();
reverse(ALL(s));
reverse(ALL(base));
mint dp[n+1][2][101]={},cnt[n+1][2][101]={};
cnt[0][0][0]=1;
rep(i,n){
for(int p=0;p<100;p++){
// +1
if(s[i]==1){
dp[i+1][0][p+1]+=dp[i][0][p]+base[i]*cnt[i][0][p];
cnt[i+1][0][p+1]+=cnt[i][0][p];
}
dp[i+1][1][p+1]+=dp[i][1][p]+base[i]*cnt[i][1][p];
cnt[i+1][1][p+1]+=cnt[i][1][p];
// +0
dp[i+1][s[i]][p]+=dp[i][0][p];
cnt[i+1][s[i]][p]+=cnt[i][0][p];
dp[i+1][1][p]+=dp[i][1][p];
cnt[i+1][1][p]+=cnt[i][1][p];
}
}
mint ans=0;
rep(p,100){
ans+=mint(p)*(dp[n][0][p]+dp[n][1][p]);
}
cout<<ans<<endl;
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0