結果
問題 | No.493 とても長い数列と文字列(Long Long Sequence and a String) |
ユーザー | chocorusk |
提出日時 | 2020-04-08 18:15:41 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 800 ms |
コード長 | 2,008 bytes |
コンパイル時間 | 1,039 ms |
コンパイル使用メモリ | 110,744 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-19 01:32:19 |
合計ジャッジ時間 | 3,760 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 115 |
ソースコード
#include <cstdio> #include <cstring> #include <iostream> #include <string> #include <cmath> #include <bitset> #include <vector> #include <map> #include <set> #include <queue> #include <deque> #include <algorithm> #include <complex> #include <unordered_map> #include <unordered_set> #include <random> #include <cassert> #include <fstream> #include <utility> #include <functional> #include <time.h> #include <stack> #include <array> #define popcount __builtin_popcount using namespace std; //typedef long long int ll; //typedef pair<int, int> P; using ll=unsigned long long; const ll MOD=1e9+7; ll powmod(ll a, ll k){ ll ap=a, ans=1; while(k){ if(k&1){ ans*=ap; ans%=MOD; } ap=ap*ap; ap%=MOD; k>>=1; } return ans; } ll inv(ll a){ return powmod(a, MOD-2); } ll a[61], s[61], p[61]; ll solves(int k, ll r){ if(r==0) return 0; if(k==1) return 1; if(r<=a[k-1]) return solves(k-1, r); int d[4], t=0, x=k*k; ll ret=s[k-1]; while(x){ d[t]=x%10; x/=10; t++; } for(int i=0; i<t; i++){ if(r-a[k-1]>i) ret+=((d[t-1-i]==0)?10:d[t-1-i]); } if(r<=a[k-1]+t) return ret; else return ret+solves(k-1, r-t-a[k-1]); } ll solvep(int k, ll r){ if(r==0 || k==1) return 1; if(r<=a[k-1]) return solvep(k-1, r); int d[4], t=0, x=k*k; ll ret=p[k-1]; while(x){ d[t]=x%10; x/=10; t++; } for(int i=0; i<t; i++){ if(r-a[k-1]>i) (ret*=((d[t-1-i]==0)?10:d[t-1-i]))%=MOD; } if(r<=a[k-1]+t) return ret; else return ret*solvep(k-1, r-t-a[k-1])%MOD; } int main() { ll k, l, r; cin>>k>>l>>r; k=min(k, 60ull); a[1]=1, s[1]=1, p[1]=1; for(int i=2; i<=60; i++){ int x=i*i; a[i]=2*a[i-1]; s[i]=2*s[i-1]; p[i]=p[i-1]*p[i-1]%MOD; int d[4], t=0; while(x){ d[t]=x%10; x/=10; s[i]+=((d[t]==0)?10:d[t]); (p[i]*=((d[t]==0)?10:d[t]))%=MOD; t++; } a[i]+=t; } if(a[k]<r){ cout<<-1<<endl; return 0; } cout<<solves(k, r)-solves(k, l-1)<<" "<<solvep(k, r)*inv(solvep(k, l-1))%MOD<<endl; return 0; }