一道大「水题」 题解

题目链接: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 ;
2 个赞

题目呢

1 个赞

不是有题目链接吗?

2 个赞

你说为啥

1 个赞

2. 一道大水题

时间限制: 1000ms

空间限制: 256000kB

题目描述

[题目描述]

有n个点,第i个点到第j个点有边当且仅当j是i的倍数且j/i为质数。(边是单向的)

给出q组询问,每次询问从第1个点走到第x个点的方案数,对1e9+7取模。

[输入格式]

第一行两个正整数n,q。

接下来q行每行一个正整数x。

[输出格式]

q行,每行一个正整数。

[输入样例]

10 5

4

6

8

9

10

[输出样例]

1

2

1

1

2

[数据范围]

对于60%的数据,n<=1000,q<=1000。

对于100%的数据,n<=500000,q<=500000。


拿去,这是班级的题目

1 个赞

没事了

1 个赞

问个问题这个题解要不要关了

1 个赞

不用,其他人有这样的

1 个赞

OK

1 个赞