結果
問題 |
No.493 とても長い数列と文字列(Long Long Sequence and a String)
|
ユーザー |
![]() |
提出日時 | 2017-03-11 00:06:10 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,362 bytes |
コンパイル時間 | 1,522 ms |
コンパイル使用メモリ | 170,684 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-06-24 09:10:56 |
合計ジャッジ時間 | 4,137 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 47 WA * 68 |
ソースコード
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef __int128 INT; #define CIN_ONLY if(1) struct cww{cww(){ CIN_ONLY{ ios::sync_with_stdio(false);cin.tie(0); } }}star; #define fin "\n" #define FOR(i,bg,ed) for(int i=(bg);i<(ed);i++) #define REP(i,n) FOR(i,0,n) #define ALL(v) (v).begin(),(v).end() #define fi first #define se second #define pb push_back #define DEBUG if(0) #define REC(ret, ...) std::function<ret (__VA_ARGS__)> template <typename T>inline void chmin(T &l,T r){l=min(l,r);} template <typename T>inline void chmax(T &l,T r){l=max(l,r);} template <typename T> istream& operator>>(istream &is,vector<T> &v){ for(auto &it:v)is>>it; return is; } const int mod=1e9+7; INT len[100]; LL sum[100]; LL mul[100]; LL getsum(LL l){ int id=60; LL res=0; while(l>0){ while(l<len[id])id--; l-=len[id]; res=(res+sum[id])%mod; } return res; } LL getmul(LL l){ int id=60; LL res=1; while(l>0){ while(l<len[id])id--; l-=len[id]; res=(res*mul[id])%mod; } return res; } // a x + b y = gcd(a, b) // O(log (a+b) ) LL extgcd(LL a, LL b, LL &x, LL &y) { LL g = a; x = 1; y = 0; if (b != 0) g = extgcd(b, a % b, y, x), y -= (a / b) * x; return g; } // mを法とするaの逆元 // O(log a) LL invMod(LL a) { LL x, y; if (extgcd(a, mod, x, y) == 1)return (x + mod) % mod; else return 0; // unsolvable } int main(){ len[0]=0; sum[0]=0; mul[0]=1; FOR(i,1,61){ LL x=i*i; len[i]=2*len[i-1]+to_string(x).size(); mul[i]=mul[i-1]*mul[i-1]%mod; sum[i]=sum[i-1]*2%mod; while(x>0){ LL y=x%10; if(y==0)y=10; mul[i]=mul[i]*y%mod; sum[i]=(sum[i]+y)%mod; x/=10; } } LL K,L,R; cin>>K>>L>>R; if(K>60)K=60; if(R>len[K]){ cout<<-1<<endl; return 0; } FOR(i,0,61){ LL x=(i+1)*(i+1); len[i]=len[i]+to_string(x).size(); while(x>0){ LL y=x%10; if(y==0)y=10; mul[i]=mul[i]*y%mod; sum[i]=(sum[i]+y)%mod; x/=10; } } LL A=mod+getsum(R)-getsum(L-1); LL B=getmul(R); if(L!=1)B*=invMod(getmul(L-1)); cout<<A%mod<<" "<<B%mod<<endl; return 0; }