码迷,mamicode.com
首页 > 其他好文 > 详细

【NOIp模拟赛】antipalindrome

时间:2017-10-08 14:13:24      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:reg   string   power   jpg   ==   lld   es2017   组合   lin   

技术分享

技术分享

分析

知识点:排列组合问题。

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

仔细划一下应该就能知道最后的答案是:$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

标签:reg   string   power   jpg   ==   lld   es2017   组合   lin   

原文地址:http://www.cnblogs.com/huihao/p/7637127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!