Hmz 的女装 (模拟,递推)

来源:互联网 发布:tomcat源码解析 编辑:程序博客网 时间:2024/04/28 18:43

Hmz 的女装

时间限制: 2 秒  内存限制: 128 MB
 
 

题目描述

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

输入

第一行三个整数n,m,k(1≤n≤100000,1≤m≤100000,1≤k≤100000)
接下来m行,每行两个整数l,r,表示要求第l朵花和第r朵花颜色相同。保证lr且 |(rlmod n| ≠1.

输出

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

样例输入

8 3 21 42 61 38 3 31 42 61 3

样例输出

02260108132



题解:找规律,递推……




#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<stdlib.h>#include<time.h>#include<string>#include<math.h>#include<map>#include<queue>#include<stack>#define INF 0x3f3f3f3f#define LL long long#define For(i,a,b) for(int i=a;i<b;i++)#define sf(a)  scanf("%d",&a)#define sfs(a)  scanf("%s",a)#define sff(a,b)  scanf("%d%d",&a,&b)#define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)#define pf(a) printf("%d\n",a)#define P()  printf("\n")#define mem(a,b) memset(a,b,sizeof(a))using namespace std;const LL MOD=1e9+7;const int MAX=1e5+7;int n,m,k;LL a[MAX];LL x;LL an;int l,r;int main(){    while(~scanf("%d%d%d",&n,&m,&k))    {a[0]=0;    x=1;    for(int i=1;i<=n;i++)    {        x=x*(LL)(k-1)%MOD;        a[i]=(x-a[i-1]+MOD)%MOD;    }    while(m--)    {        scanf("%d%d",&l,&r);        an=k*a[abs(r-l)-1]%MOD*a[n-(abs(r-l)+1)]%MOD;        printf("%lld\n",an);    }   }}








0 0