标签: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