NC20412. [SHOI2009]COIN
描述
输入描述
输入文件只有一行,包含一个正奇数n
1 ≤ N ≤ 10^9
输出描述
输出文件包含1行,表示不同纪念币的枚数的最后120位。这120位从高位到低位依次输出,位数不足的用0在高位补足。
示例1
输入:
17
输出:
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020922789888000
Python2 解法, 执行用时: 2914ms, 内存消耗: 3888K, 提交时间: 2022-12-24 21:54:48
def phi(x): i=2 y=x; while i*i<=x: if x%i==0: y=y//i*(i-1) while x%i==0: x//=i i+=1 if x>1: y=y//x*(x-1) return y def mul(a,b): global mod c=[0]*324 for i in range(18): for k in range(i+1): v=a[i*18+k] if not v: continue for j in range(k+1): c[i*18+j]+=v*b[k*18+j] for i in range(324): c[i]%=mod return c def cal(n): global mod,ps,ans if n<17: return 0 x=[0]*324 for i in range(18): x[i*19]=1 for i in range(32): if n>>i&1: x=mul(x,ps[i]) return x[17*18] n=int(input()) ps=[[0]*324] mod=10**120*n for i in range(1,18): ps[0][i*19]=i ps[0][i*19-1]=1 for i in range(32): ps.append(mul(ps[i],ps[i])) ans=0 i=1 while i*i<=n: if n%i==0: j=n//i ans+=cal(i)*phi(j) if i!=j: ans+=cal(j)*phi(i) i+=1 for i in range(1,18): ans*=i ans=str(ans%mod//n) print("0"*(120-len(ans))+ans)