【NOIp模擬賽】antipalindrome
阿新 • • 發佈:2017-10-08
sin 不用 const -1 ges getc print log ans
分析
知識點:排列組合問題。
本題貌似和回文字符串沒有太大的關系。
仔細劃一下應該就能知道最後的答案是:$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> usingnamespace 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\n",ans); } return 0; }
【NOIp模擬賽】antipalindrome