1. 程式人生 > >【NOIp模擬賽】antipalindrome

【NOIp模擬賽】antipalindrome

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>
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\n",ans); } return 0; }

【NOIp模擬賽】antipalindrome