标签:algorithm div 字符串 ace stream pre cst pac 字母
题意:给你两个整数 n 和 m ,计算字母表大小为 m ,长度为 n ,不包含长度大于1的回文子串的字符串个数
题解:
规律+快速幂
一个字符不能和它前面两个字符相等,这样就构不成最小的回文,那么更大的也构不成
所以对于第一个字符有m种,第二个字符m-1种,后面的都是m-2种
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int Mo = 1000000007;
int T;
ll n,m;
ll gi() {
ll x=0,o=1; char ch=getchar();
while(ch!=‘-‘ && (ch<‘0‘ || ch>‘9‘)) ch=getchar();
if(ch==‘-‘) o=-1,ch=getchar();
while(ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
return o*x;
}
ll qpow(ll x, ll y) {
if(x<0) return 0;
x%=Mo,y%=(Mo-1);
ll ret=1;
while(y) {
if(y&1ll) (ret*=x%Mo)%=Mo;
x=x*x%Mo;
y>>=1ll;
}
return ret;
}
int main() {
cin>>T;
while(T--) {
n=gi(),m=gi();
if(n==1) {printf("%lld\n", m%Mo);continue;}
if(n==2) {printf("%lld\n", (m%Mo)*((m-1)%Mo)%Mo);continue;}
ll ans1,ans2;
ans1=(m%Mo*((m-1)%Mo))%Mo;
ans2=qpow(m-2,n-2)%Mo;
printf("%lld\n", (ans1*ans2)%Mo);
}
return 0;
}
标签:algorithm div 字符串 ace stream pre cst pac 字母
原文地址:http://www.cnblogs.com/HLXZZ/p/7544627.html