分析
知识点:排列组合问题。
本题貌似和回文字符串没有太大的关系。
仔细划一下应该就能知道最后的答案是:$ans=m*(m-1)*(m-2)*....*(m-2)$
但是还是有很多坑的,数据很强一个想不到就会WA声一片。
1.要特判n==1的情况 此时答案就是$m%mod$。
2.m==1的情况就不用特判了,因为m==1的话,$m-1=0$,所以答案最终是0。
3.注意中间过程的溢出,做数论的题目一定要注意这一点。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const ll mod=1e9+7; inline ll read() { register ll x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} return x*f; } ll n,m,ans; ll power(ll a,ll p){ ll res=1,base=a%mod;//防止中间过程溢出 for(register ll i=p;i;i=i>>1,base=base*base%mod) if(i&1) res=res*base%mod; return res; } int main() { freopen("anti.in","r",stdin); freopen("anti.out","w",stdout); register int T=read(); while(T--){ n=read();m=read(); if(n==1) ans=m%mod; else{ ans=power(m-2,n-2); ans=(ans*(m%mod))%mod;//最好分步做,清晰不容易出错 ans=(ans*((m-1)%mod))%mod;//防止溢出 } printf("%lld ",ans); } return 0; }