前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hdu 5187 高速幂高速乘法

hdu 5187 高速幂高速乘法

作者头像
全栈程序员站长
发布2022-07-07 16:42:00
6670
发布2022-07-07 16:42:00
举报

大家好,又见面了,我是全栈君。

http://acm.hdu.edu.cn/showproblem.php?pid=5187

Problem Description

As one of the most powerful brushes, zhx is required to give his juniors n problems. zhx thinks the ith problem’s difficulty is i . He wants to arrange these problems in a beautiful way. zhx defines a sequence {ai} beautiful if there is an i that matches two rules below: 1: a1..ai are monotone decreasing or monotone increasing. 2: ai..an are monotone decreasing or monotone increasing. He wants you to tell him that how many permutations of problems are there if the sequence of the problems’ difficulty is beautiful. zhx knows that the answer may be very huge, and you only need to tell him the answer module p .

Input

Multiply test cases(less than 1000 ). Seek EOF as the end of the file. For each case, there are two integers n and p separated by a space in a line. ( 1≤n,p≤1018 )

Output

For each test case, output a single line indicating the answer.

Sample Input

代码语言:javascript
复制
    2 233
3 5

Sample Output

代码语言:javascript
复制
    2
1


    
     
      
      Hint 
     In the first case, both sequence {1, 2} and {2, 1} are legal. In the second case, sequence {1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1} are legal, so the answer is 6 mod 5 = 1 
代码语言:javascript
复制
/**
hdu 5187  高速幂高速乘法
题目大意:(转)数字1~n,按某种顺序排列。且满足下列某一个条件:(1)a1~ai递增,ai~an递减(2)a1~ai递减,ai~an递增。
      问有多少种不同的排列。
解题思路:首先是所有递减或所有递增各一种;另外就是满足上列两个条件的情况了。要想满足条件(1)那就仅仅能把最大的n放在i位置,
       共同拥有C(1,n-1)+C(2。n-1)+。。。+C(n-2,n-1)即2^(n-1)-2;条件(2)与(1)同样,所以共同拥有(2^(n-1)-2)*2+2=2^n-2.**/#include <stdio.h>#include <string.h>#include <algorithm>#include <iostream>using namespace std;typedef long long LL;LL n,p;LL qui_mul(LL x,LL m)///高速乘法{    LL re=0;    while(m)    {        if(m&1)        {            re=(re+x)%p;        }        x=(x+x)%p;        m>>=1;    }    return re;}LL qui_pow(LL a,LL n)///高速幂{    LL ret=1;    LL tem=a%p;    while(n)    {        if(n%1)ret=qui_mul(ret,temp)%p;        temp=qui_mul(temp,temp)%p;        n>>=1;    }    return ret;}int main(){    while(~scanf("%I64d%I64d",&n,&p))    {        if(n==1)        {            if(p==1)                printf("0\n");            else                 printf("1\n");        }        printf("%I64d\n",(qui_mul(2,n)-2)%p);    }    return 0;}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116588.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档