NOIp模拟赛antipalindrome

Posted 沐灵_hh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIp模拟赛antipalindrome相关的知识,希望对你有一定的参考价值。

分析

知识点:排列组合问题。

本题貌似和回文字符串没有太大的关系。

仔细划一下应该就能知道最后的答案是:$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的主要内容,如果未能解决你的问题,请参考以下文章

noip模拟赛 写代码

[9.18考试] antipalindrome

NOIp模拟赛binary

NOIP模拟赛16

NOIp模拟赛value

2017 10.25 NOIP模拟赛