首页 > 代码库 > (dp)17bupt新生赛——B. Hmz 的女装

(dp)17bupt新生赛——B. Hmz 的女装

B. Hmz 的女装 2017新生赛

时间限制 1000 ms 内存限制 65536 KB

题目描述

Hmz为了女装,想给自己做一个长度为n的花环。现在有k种花可以选取,且花环上相邻花的种类不能相同。
Hmz想知道,如果他要求第l朵花和第r朵花颜色相同,做花环的方案数是多少。这个答案可能会很大,你只要输出答案对109+7取模的结果即可。

输入格式

第一行三个整数n,m,k(1n100000,1m100000,1k100000)
接下来m行,每行两个整数l,r,表示要求第l朵花和第r朵花颜色相同。保证lr |(r?l) mod n| 1.

输出格式

输出m行。对于每一个询问输出一个整数,表示做花环的方案数对109+7取模的结果。

输入样例

8 3 2
1 4
2 6
1 3
8 3 3
1 4
2 6
1 3

输出样例

0
2
2
60
108
132

比赛时真该做这个……非常水的递推
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <cstring>
 7 #include <string>
 8 #include <vector>
 9 #include <map>
10 #include <queue>
11 using namespace std;
12 typedef long long LL;
13 const LL MOD=1e9+7;
14 const int MAX=1e5+7;
15 int n,m,k;
16 LL a[MAX];
17 LL x;
18 LL an;
19 int l,r;
20 int main()
21 {
22     scanf("%d%d%d",&n,&m,&k);
23     a[0]=0;
24     x=1;
25     for(int i=1;i<=n;i++)
26     {
27         x=x*(LL)(k-1)%MOD;
28 //        printf("%d\n",x);
29         a[i]=(x-a[i-1]+MOD)%MOD;
30     }
31     while(m--)
32     {
33         scanf("%d%d",&l,&r);
34         an=k*a[abs(r-l)-1]%MOD*a[n-(abs(r-l)+1)]%MOD;
35         printf("%lld\n",an);
36     }
37     return 0;
38 }

 

 

(dp)17bupt新生赛——B. Hmz 的女装