题目链接:problem
题目本来就很清真,直接复制一下(滑稽 :
有n个点,第i个点到第j个点有边当且仅当j是i的倍数且j/i为质数。(边是单向的)
给出q组询问,每次询问从第1个点走到第x个点的方案数,对1e9+7取模。
解法一 (较复杂) :
一眼看是图论,先进行埃氏筛,建图
for (int i = 2 ; i <= n ; i ++)
if (f [i] == 0)
for (int j = i * i ; j <= n ; j += i)
f [j] = 1 ;
for (int i = 2 ; i <= n ; i ++)
if (f [i] == 0)
for (int j = 1 ; j <= n / i ; j ++)
a [j].push_back (j * i) ;
接下来从1开始进行拓扑排序,然后进行dp
dp状态就是节点加所有的父亲的状态
dp [sx] += dp [fx] ; // sx为fx的儿子节点
(记得要 dp[1] = 1 ;
)
接下来输入什么就输出dp [x]
(记得要取模)
解法二 (较为简单):
其实用不着建图,可以直接进行dp
枚举 i 和 j ,判断 j/i 是否为素数,是的话dp,同上
关键代码:
for (int i = 1 ; i <= n ; i ++)
for (int j = i * 2 ; j <= n ; j += i)
if (is_prime (j / i))
dp [j] = (dp [j] + dp[i]) % mod ;