結果
問題 | No.493 とても長い数列と文字列(Long Long Sequence and a String) |
ユーザー |
![]() |
提出日時 | 2017-03-11 01:40:35 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 800 ms |
コード長 | 3,541 bytes |
コンパイル時間 | 1,562 ms |
コンパイル使用メモリ | 173,296 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-24 09:29:16 |
合計ジャッジ時間 | 4,175 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 115 |
ソースコード
#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 len1[100];LL sum1[100];LL mul1[100];INT len2[100];LL sum2[100];LL mul2[100];LL getsum(LL l){int id=60;LL res=0;while(l>0){while(l<len2[id]){if(len1[id]<=l){int x=(id+1)*(id+1);vector<int> y;while(x){int z=x%10;if(z==0)z=10;y.pb(z);x/=10;}reverse(ALL(y));res=(res+sum1[id]);REP(i,l-len1[id])res=(res+y[i]);// cout<<id<<" "<<(LL)(l-len1[id])<<endl;return res;}id--;}l-=len2[id];res=(res+sum2[id]);id--;}return res;}LL getmul(LL l){int id=60;LL res=1;while(l>0){while(l<len2[id]){if(len1[id]<=l&&l<=len2[id]){int x=(id+1)*(id+1);vector<int> y;while(x){int z=x%10;if(z==0)z=10;y.pb(z);x/=10;}reverse(ALL(y));res=(res*mul1[id])%mod;REP(i,l-len1[id])res=(res*y[i])%mod;return res;}id--;}l-=len2[id];res=(res*mul2[id])%mod;id--;}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(){len1[0]=0;sum1[0]=0;mul1[0]=1;FOR(i,1,61){LL x=i*i;len1[i]=2*len1[i-1]+to_string(x).size();mul1[i]=mul1[i-1]*mul1[i-1]%mod;sum1[i]=sum1[i-1]*2;while(x>0){LL y=x%10;if(y==0)y=10;mul1[i]=mul1[i]*y%mod;sum1[i]=(sum1[i]+y);x/=10;}}LL K,L,R;cin>>K>>L>>R;if(K>60)K=60;if(R>len1[K]){cout<<-1<<endl;return 0;}FOR(i,0,61){LL x=(i+1)*(i+1);len2[i]=len1[i]+to_string(x).size();mul2[i]=mul1[i];sum2[i]=sum1[i];while(x>0){LL y=x%10;if(y==0)y=10;mul2[i]=mul2[i]*y%mod;sum2[i]=(sum2[i]+y);x/=10;}}LL A=getsum(R)-getsum(L-1);LL B=getmul(R);if(L!=1)B*=invMod(getmul(L-1));cout<<A<<" "<<B%mod<<endl;//REP(i,30)cout<<getsum(i)<<endl;return 0;}