結果
| 問題 |
No.2703 FizzBuzz Letter Counting
|
| コンテスト | |
| ユーザー |
ゼット
|
| 提出日時 | 2024-03-30 00:27:05 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 2,891 ms / 3,000 ms |
| コード長 | 3,528 bytes |
| コンパイル時間 | 282 ms |
| コンパイル使用メモリ | 82,404 KB |
| 実行使用メモリ | 82,568 KB |
| 最終ジャッジ日時 | 2024-09-30 17:18:06 |
| 合計ジャッジ時間 | 84,522 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 60 |
ソースコード
N=int(input())
u15=[0]*60
v15=[0]*60
v15[0]=10
mod=998244353
for j in range(1,60):
x,y=(u15[j-1]**2%mod)*15+2*v15[j-1]*u15[j-1],v15[j-1]**2
if y>=15:
x+=y//15
y%=15
x%=mod
y%=mod
u15[j],v15[j]=x,y
u5=[0]*60
v5=[0]*60
u5[0]=2
gg=[1]*60
for j in range(1,60):
gg[j]=gg[j-1]*2
for j in range(1,60):
x,y=(u5[j-1]**2%mod)*5+2*v5[j-1]*u5[j-1],v5[j-1]**2
if y>=5:
x+=y//5
y%=5
x%=mod
y%=mod
u5[j],v5[j]=x,y
u0=[0]*60
v0=[0]*60
v0[0]=10
for j in range(1,60):
v0[j]=v0[j-1]**2
v0[j]%=mod
u3=[0]*60
v3=[0]*60
u3[0]=3
v3[0]=1
for j in range(1,60):
x,y=(u3[j-1]**2%mod)*3+2*v3[j-1]*u3[j-1],v3[j-1]**2
if y>=3:
x+=y//3
y%=3
x%=mod
y%=mod
u3[j],v3[j]=x,y
o=0
def g(l,c):
x,y=0,1
if c==15:
for k in range(60):
if gg[k]>l:
break
if (l>>k)&1:
a,b=u15[k],v15[k]
x2,y2=(x*a%mod)*15+y*a+b*x,b*y
x2%=mod
y2%=mod
if y2>=15:
x2+=y2//15
y2%=15
x,y=x2,y2
elif c==5:
for k in range(60):
if gg[k]>l:
break
if (l>>k)&1:
a,b=u5[k],v5[k]
x2,y2=(x*a%mod)*5+y*a+b*x,b*y
x2%=mod
y2%=mod
if y2>=5:
x2+=y//5
y2%=5
x,y=x2,y2
elif c==3:
for k in range(60):
if gg[k]>l:
break
if (l>>k)&1:
a,b=u3[k],v3[k]
x2,y2=(x*a%mod)*3+y*a+b*x,b*y
x2%=mod
y2%=mod
if y2>=3:
x2+=y//3
y2%=3
x,y=x2,y2
else:
for k in range(60):
if gg[k]>l:
break
if (l>>k)&1:
y*=v0[k]
y%=mod
return x,y
mm=0
def f(a2,l,c):
global mm
x,y=0,0
a,b=0,0
for k in range(60,-1,-1):
mm+=1
x,y=((x*a)%mod)*c+(b+1)*x+y*a,y*(b+1)
x+=y//c
y%=c
a,b=((a**2)%mod)*c+b*a+a*b,b*b
a+=b//c
b%=c
x%=mod
a%=mod
if (l>>k)&1:
x*=10
y*=10
x%=mod
y+=a2
x+=y//c
y%=c
if a==0 and b==0:
b=10
continue
a*=10
b*=10
a%=mod
a+=b//c
b%=c
x%=mod
a%=mod
return x,y
def h(n):
if n==0:
return 0
ans=1-(n+1)*pow(10,n,mod)+n*pow(10,n+1,mod)
ans%=mod
ans*=pow(81,-1,mod)
ans%=mod
ans*=480
ans%=mod
w=10*(pow(10,n,mod)-1)
w%=mod
w*=pow(9,-1,mod)
w%=mod
w*=96
result=ans+w
result%=mod
return result
count=0
ans=''
L=[]
for i in range(N):
v,l=map(int,input().split())
if count+l<=2:
ans+=str(v)*l
count+=l
L.append((v,l))
def t(a,l,count,c):
x1,y1=f(a,l,c)
x2,y2=g(count,c)
x,y=((x1*x2)%mod)*c+y1*x2+x1*y2,y1*y2
if y>=c:
x+=y//c
y%=c
return x,y
if count<=2:
result=0
x=int(ans)
for y in range(1,x+1):
if y%15==0:
result+=8
elif y%5==0:
result+=4
elif y%3==0:
result+=4
else:
z=str(y)
result+=len(z)
print(result)
exit()
a0,a1=0,0
b0,b1=0,0
c0,c1=0,0
d=0
count=0
for i in range(N-1,-1,-1):
v,l=L[i][:]
a2,a3=t(v,l,count,15)
a0+=a2
a1+=a3
a0+=a1//15
a1%=15
b2,b3=t(v,l,count,5)
b0+=b2
b1+=b3
b0+=b1//5
b1%=5
c2,c3=t(v,l,count,3)
c0+=c2
c1+=c3
c0+=c1//3
c1%=3
d2,d3=t(v,l,count,mod)
d+=d3
d%=mod
count+=l
u=10**9+7
result=a0*8+(b0-a0)*4+(c0-a0)*4
result%=mod
d-=a0+(b0-a0)+(c0-a0)
_,k=f(9,count-1,mod)
k1,_=f(9,count-1,15)
k2,_=f(9,count-1,5)
k3,_=f(9,count-1,3)
w=k-(k1+(k2-k1)+(k3-k1))
d-=w
result+=d*count
result+=h(count-3)
result%=mod
for x in range(1,100):
if x%5!=0 and x%3!=0:
y=str(x)
result+=len(y)
result%=mod
print(result)
ゼット