克拉克是一名人格分裂患者。某一天他变成一名数学家,在研究奇怪的东西。
他突然想算这么一个式子,给出 ,要求算:
是整除的意思,比如 , 则 。
Constraints
,
Solution
考虑从 到 的变化过程,等价于 乘上 个数得到 ,实际只要求满足 个数乘起来为 的因数的方案数即可。
对 分解质因数,考虑其中的一个质因子 以及它的次数 ,利用隔板法可得当前质因子的贡献是 (将 个 分配到这 个数里)。
很大,用 Lucas 定理可得直接将 取模即可。
剩下的就直接线性筛了。
Code
1 |
|
Living is do or die.
克拉克是一名人格分裂患者。某一天他变成一名数学家,在研究奇怪的东西。
他突然想算这么一个式子,给出 f(i),1≤i≤n ,要求算:
g(i)=i1∣i∑i2∣i1∑i3∣i2∑⋯ik∣ik−1∑f(ik) mod 1000000007 (1≤i≤n,ij∈N+)
∣ 是整除的意思,比如 i1=5 , i2=10 则 i1∣i2。
1≤n≤500000 , 1≤k≤101000000
考虑从 ik 到 i 的变化过程,等价于 ik 乘上 k 个数得到 i ,实际只要求满足 k 个数乘起来为 iki 的因数的方案数即可。
对 iki 分解质因数,考虑其中的一个质因子 p 以及它的次数 x ,利用隔板法可得当前质因子的贡献是 (k−1k−x−1) (将 x 个 p 分配到这 k 个数里)。
k 很大,用 Lucas 定理可得直接将 k 取模即可。
剩下的就直接线性筛了。
1 | #include<cstdio> |