結果

問題 No.493 とても長い数列と文字列(Long Long Sequence and a String)
ユーザー chocorusk
提出日時 2020-04-08 18:09:53
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,936 bytes
コンパイル時間 991 ms
コンパイル使用メモリ 110,536 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-07-19 00:54:36
合計ジャッジ時間 3,625 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 89 WA * 26
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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;
if(r-a[k-1]>t) ret+=((d[t]==0)?10:d[t]);
t++;
}
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;
if(r-a[k-1]>t) (ret*=((d[t]==0)?10:d[t]))%=MOD;
t++;
}
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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0