結果

問題 No.381 名声値を稼ごう Extra
ユーザー どららどらら
提出日時 2016-06-18 01:30:27
言語 C++11
(gcc 11.4.0)
結果
TLE  
実行時間 -
コード長 4,613 bytes
コンパイル時間 2,132 ms
コンパイル使用メモリ 112,740 KB
実行使用メモリ 31,648 KB
最終ジャッジ日時 2024-10-09 20:20:31
合計ジャッジ時間 11,703 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 4 ms
6,820 KB
testcase_01 TLE -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <iostream>
#include <queue>
#include <list>
#include <stack>
#include <map>
#include <numeric>
#include <set>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
#define REP(i,a,n) for(int i=(a); i<(int)(n); i++)
#define rep(i,n) REP(i,0,n)
#define FOR(it,c) for(__typeof((c).begin()) it=(c).begin(); it!=(c).end(); ++it)
#define ALLOF(c) (c).begin(), (c).end()

#define MOD 1004535809LL

typedef long long ll;
typedef unsigned long long ull;

class Bignum{
public:
  Bignum(){}
  Bignum(string s){
    for(int i=0;i<s.length();i++) d.push_front(s[i]-'0');
    normalize();
  }
  Bignum &normalize(){
    for(int i=d.size()-1;i>=0;i--){ if(d[i]!=0) break; d.pop_back(); }
    return *this;
  }
  int operator[](int i){ return i>=d.size()?0:d[i]; }
  int size(){ return normalize(),d.size(); }
  void toZero(){ d.clear(); d.push_front(0); }
  void toOne(){ d.clear(); d.push_front(1); }
  Bignum &inc(){ Bignum one("1"); return operator+=(one); }
  Bignum &operator+=(Bignum n){
    int l=max(size(),n.size());
    d.resize(l+1,0);
    for(int c=0,i=0;i<=l;i++) d[i]=(c=d[i]+n[i]+c/10)%10;
    return normalize();
  }
  Bignum &operator-=(Bignum n){
    //assert(size()>=n.size());
    for(int c=0,i=0;i<d.size();i++) d[i]=((c=d[i]-n[i]+(c-9)/10)+10)%10;
    return normalize();
  }
  Bignum &operator*=(int n){
    for(int i=0;i<15;i++) d.push_back(0);
    for(int c=0,i=0;i<d.size();i++) d[i]=(c=d[i]*n+c/10)%10;
    return normalize();
  }
  Bignum &operator*=(ull n){
    for(int i=0;i<25;i++) d.push_back(0);
    for(ull c=0,i=0;i<d.size();i++) d[i]=(c=d[i]*n+c/10ULL)%10ULL;
    return normalize();
  }
  bool operator==(Bignum n){
    for(int i=0;i<d.size();i++){
      if(d[i] != n[i]) return false;
    }
    return true;
  }
  Bignum operator+(Bignum n){ return Bignum(*this)+=n; }
  Bignum operator-(Bignum n){ return Bignum(*this)-=n; }
  Bignum operator*(int n){ return Bignum(*this)*=n; }
  Bignum operator*(ull n){ return Bignum(*this)*=n; }
  Bignum operator*(Bignum n){
    Bignum ret;
    int ka=size(),kb=n.size();
    ret.d.resize(ka+kb,0);
    for(int i=0;i<ka;i++) for(int c=0,j=0;j<=kb;j++) ret.d[i+j]=(c=ret.d[i+j]+d[i]*n[j]+c/10)%10;
    return ret.normalize();
  }
  Bignum &operator*=(Bignum n){ return (*this)=(*this)*n; }

  int div(int n){
    int c=0;
    for(int i=size()-1;i>=0;i--) d[i]=(c=c%n*10+d[i])/n;
    return c%n;
  }
  Bignum &operator<<=(int n){
    for(int i=0;i<n;i++) d.push_front(0);
    return normalize();
  }
  Bignum operator<<(int n){ return Bignum(*this)<<=n; }
  bool operator>(Bignum n){
    if(size()!=n.size()) return size()>n.size();
    for(int i=size()-1;i>=0;i--) if(d[i]!=n[i]) return d[i]>n[i];
    return false;
  }
  deque<int> d;
};
pair<Bignum,Bignum> ldiv(Bignum a, Bignum b)
{
  Bignum ret;
  for(int i=a.size()-1;i>=0;i--){
    int n;
    for(n=1;n<10;n++) if(((b*n)<<i)>a) break;
    a-=(b*(n-1))<<i;
    ret.d.push_front(n-1);
  }
  return make_pair(ret.normalize(),a.normalize());
}

vector<int> dec2bin(const string& N){
  vector<int> v;
  Bignum a(N);
  Bignum zero("0");
  while(!(a == zero)){
    pair<Bignum,Bignum> res = ldiv(a,Bignum("2"));
    if(res.second == zero){
      v.push_back(0);
    }else{
      v.push_back(1);
    }
    a = res.first;
  }
  reverse(ALLOF(v));
  return v;
}

vector<int> calc(const vector<int>& w, const vector<int>& w2){
  vector<int> x, x2;
  x.push_back(0);
  x2.push_back(0);
  rep(i,w.size()) x.push_back(w[i]);
  rep(i,w2.size()) x2.push_back(w2[i]);
  rep(i,x2.size()){
    if(x2[i] == 0) x2[i] = 1;
    else x2[i] = 0;
  }
  
  int c = 1;
  for(int i=x2.size()-1; i>=0; i--){
    if(x2[i]+c+x[i] == 0){
      x2[i] = 0;
    }
    else if(x2[i]+c+x[i] == 1){
      x2[i] = 1;
      c = 0;
    }
    else if(x2[i]+c+x[i] == 2){
      x2[i] = 0;
      c = 1;
    }
    else if(x2[i]+c+x[i] == 3){
      x2[i] = 1;
      c = 1;
    }
  }
  return x2;
}

int main(){
  ios::sync_with_stdio(false);
  string N;
  cin >> N;
  vector<int> v = dec2bin(N);

  vector<int> w = v, y(v.size()+1, 0), w2(v.size()+1, 0);
  w.push_back(0);

  int cnt = 0;
  REP(i,1,y.size()){
    cnt += v[i-1];
    y[i] = cnt;
  }
  int c = 0;
  for(int i=y.size()-1; i>0; i--){
    w2[i] = (y[i]+c)%2;
    c = (y[i]+c)/2;
  }
  if(c == 1){
    w2[0] = 1;
  }

  vector<int> res = calc(w, w2);

  c = 0;
  ll ret = 0;
  ll p = 1;
  for(int i=res.size()-1; i>=0; i--){
    if(res[i] == 1){
      ret += p;
      ret %= MOD;
    }
    p *= 2;
    p %= MOD;
  }
  cout << ret << endl;
  
  return 0;
}

0