Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.07 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. const ll mod=1e9+7;
  6. ll pw[100],dp[100][3][3],n;
  7. int DP(int x,bool y,bool z){
  8.     if(x==-1)return 1;
  9.     ll ret=dp[x][y][z];if(ret!=-1)return ret;
  10.     ret=0;
  11.     bool bit=((bool)(n&(1ll<<x)));
  12.     if(y&&z)return ret=pw[x+1];
  13.     if(!y&&!z){
  14.         if(bit){
  15.             ret+=DP(x-1,1,0)%mod;
  16.             ret+=DP(x-1,0,1)%mod;
  17.             ret+=DP(x-1,1,1)%mod;
  18.         }
  19.         else{
  20.             ret+=DP(x-1,0,0)%mod;
  21.         }
  22.     }
  23.     if(y&&!z){
  24.         if(bit){
  25.             ret+=(DP(x-1,y,1)*2)%mod;
  26.             ret+=DP(x-1,y,0)%mod;
  27.         }
  28.         else{
  29.             ret+=(DP(x-1,y,z)*2)%mod;
  30.         }
  31.     }
  32.     if(!y&&z){
  33.         if(bit){
  34.             ret+=(DP(x-1,1,z)*2)%mod;
  35.             ret+=DP(x-1,0,z)%mod;
  36.         }
  37.         else{
  38.             ret+=(DP(x-1,y,z)*2)%mod;
  39.         }
  40.     }
  41.     ret%=mod;
  42.     return ret;
  43. }
  44. int main(){
  45.     pw[0]=1;
  46.     for(int i=1;i<=61;i++)pw[i]=(pw[i-1]*3)%mod;
  47.     memset(dp,-1,sizeof(dp));
  48.     cin>>n;
  49.     cout<<DP(61,0,0)<<endl;
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement