結果
問題 | No.1973 Divisor Sequence |
ユーザー |
![]() |
提出日時 | 2022-06-12 11:11:19 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 96 ms / 2,000 ms |
コード長 | 2,830 bytes |
コンパイル時間 | 345 ms |
コンパイル使用メモリ | 82,532 KB |
実行使用メモリ | 76,120 KB |
最終ジャッジ日時 | 2024-09-22 21:38:01 |
合計ジャッジ時間 | 2,401 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 22 |
ソースコード
mod=10**9+7#####################def mul(a,b):n=len(a)m=len(b[0])res=[[0]*m for i in range(n)]for i in range(n):for j in range(m):for k in range(len(a[0])):res[i][j]+=a[i][k]*b[k][j]res[i][j]%=modreturn resdef mpow(a,n):N = len(a)if n == 0:res = [[0] * N for i in range(N)]for i in range(N):res[i][i] = 1return resif n==1:return ares=mpow(a,n//2)res=mul(res,res)if n%2==1:res=mul(res,a)return resdef det(A):a=[]for line in A:a.append(line[:])n=len(a)f=1for now in range(n):ind=-1for i in range(now,n):a[i][now]%=modif a[i][now]>0:ind=ibreakif ind==-1:return 0a[now],a[ind]=a[ind],a[now]if now!=ind:f*=-1f=f*a[now][now]%modinv=pow(a[now][now],mod-2,mod)for j in range(now,n):a[now][j]*=inva[now][j]%=modfor i in range(now+1,n):x=a[i][now]for j in range(now,n):a[i][j]-=a[now][j]*xa[i][j]%=modfor i in range(n):f*=a[i][i]f%=modreturn fdef minv(A):n=len(A)if det(A)==0:return -1a=[]for i in range(n):e=[0]*ne[i]=1a.append(A[i][:]+e)for now in range(n):ind = -1for i in range(now, n):a[i][now] %= modif a[i][now] > 0:ind = ibreakif ind == -1: return -1a[now], a[ind] = a[ind], a[now]inv = pow(a[now][now], mod - 2, mod)for j in range(now, 2*n):a[now][j] *= inva[now][j] %= modfor i in range(now + 1, n):x = a[i][now]for j in range(now, 2*n):a[i][j] -= a[now][j] * xa[i][j] %= modfor now in range(n-1,-1,-1):for i in range(now-1,-1,-1):x=a[i][now]for j in range(2*n):a[i][j]-=a[now][j]*xa[i][j]%=modres=[]for l in a:res.append(l[n:])return res#######################from _collections import defaultdictn,m=map(int,input().split())x=md=defaultdict(int)for p in range(2,m+1):if p**2>x:breakwhile x%p==0:x//=pd[p]+=1if x>1:d[x]+=1ans=1for p in d:k=d[p]a=[[0]*(k+1) for i in range(k+1)]for x in range(k+1):for y in range(k+1):if x+y<=k:a[x][y]+=1dp=[[0] for i in range(k+1)]dp[0][0]=1a=mpow(a,n)dp=mul(a,dp)res=0for x in range(k+1):res+=dp[x][0]ans*=resans%=modprint(ans)