hdu 5187 基于快速幂的快速乘法

zhx‘s contest

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 3568    Accepted Submission(s): 1146

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

2 233
3 5

Sample Output

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

Source

BestCoder Round #33

Recommend

hujie   |   We have carefully selected several similar problems for you:  6297 6296 6295 6294 6293

快速乘法指的是在 a*b会爆ll 的情况下所进行的操作>>从而不必应用java大数来操作

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,p;
ll multi(ll a,ll b){
	ll res=0,tmp=a;
	while(b){
		if(b&1) (res+=tmp)%=p;
		b/=2;
		(tmp+=tmp)%=p;
	}
	return res;
}
ll pow_(ll a,ll b){
	ll res=1,tmp=a;
	while(b){
		if(b&1) res=multi(res,tmp);
		tmp=multi(tmp,tmp);
		b/=2;
	}
	return res;
}
int main(){
	while(cin>>n>>p){
		ll ans=pow_(2,n);
		ans-=2;
		ans=(ans%p+p)%p;
		cout<<ans<<endl;
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/vainglory/p/9201749.html

时间: 2024-10-04 09:03:35

hdu 5187 基于快速幂的快速乘法的相关文章

HDU - 5187 zhx&#39;s contest(快速幂+快速乘法)

作为史上最强的刷子之一,zhx的老师让他给学弟(mei)们出n道题.zhx认为第i道题的难度就是i.他想要让这些题目排列起来很漂亮. zhx认为一个漂亮的序列{ai}下列两个条件均需满足. 1:a1..ai是单调递减或者单调递增的. 2:ai..an是单调递减或者单调递增的. 他想你告诉他有多少种排列是漂亮的.因为答案很大,所以只需要输出答案模p之后的值. Input Multiply test cases(less than 10001000). Seek EOF as the end of

Acdream 1007 快速幂,模乘法

http://acdream.info/problem?pid=1007 题目大意,给你n个数,输出这n个数的k次方的和,注意最后的结果得是正数. 刚开始因为模乘法没有考虑好,一直死wa不过,后来在模乘法中特判一下,终于ac了. #include<cstdio> typedef long long LL; const LL MOD = 10000000007LL; int n; LL k, temp, sum; LL mul_mod(LL a, LL b) { LL res = 0; int

hdu 4549 M斐波那契数列(矩阵快速幂,快速幂降幂)

http://acm.hdu.edu.cn/showproblem.php?pid=4549 f[0] = a^1*b^0%p,f[1] = a^0*b^1%p,f[2] = a^1*b^1%p.....f[n] = a^fib[n-1] * b^fib[n-2]%p. 这里p是质数,且a,p互素,那么我们求a^b%p,当b很大时要对b降幂. 因为a,p互素,那么由费马小定理知a^(p-1)%p = 1.令b = k*(p-1) + b',a^b%p = a^(k*(p-1)+b')%p = a

关于快速幂、快速乘、矩阵快速幂

一.快速幂 快速幂是用于解决类似$a^b$ $mod$ $p$值类型的问题的.使用普通的方法是从$1$循环至$b$,再逐次累乘,逐次取模.但这种方法对于$b$很大的时候却可能会超时.那么,这时候我们就需要使用快速幂了. 快速幂是基于以下式子: 若$b$ $mod$ $2=1$,则$a^b=a^\frac{b}{2}\times a^\frac{b}{2}\times a$ 若$b$ $mod$ $2=0$,则$a^b=a^\frac{b}{2}\times a^\frac{b}{2}$ 这样,我

快速幂计算(整数快速幂/矩阵快速幂)

库函数pow是用朴素算法对浮点型数据进行幂运算的,时间复杂度为o(n),计算比较大的数可能会超时和数据溢出: //*************快速幂计算**************************************** 朴素算法实现: ll get_pow(ll x, ll n)  //** (这里的n要求不小于0,如果n小于0则令n=-n,并且最终返回1.0/ans即可){    ll ans=1;    while(n--)    {        ans*=x%MAX;    

模板C++ 02数论算法 5快速幂及快速乘

2.5快速幂及快速乘 int qmul(int x,int y) { int s=0; while(y) { if(y&1) s=(s+x)%p; x=(x+x)%p; y>>1; } return s%p; } int qpow(int x,int y) { int s=1; while(y) { if(y&1) s=qmul(s,x); x=qmul(x,x); y>>1; } return s%p; }

求幂大法,矩阵快速幂,快速幂模板题--hdu4549

hdu-4549 求幂大法.矩阵快速幂.快速幂 题目 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 6217 Accepted Submission(s): 1902 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] *

hdu 5187 快速幂 + 快速加 值得学习

就是以那个ai为分水岭,左边和右边都分别是单调增或单调减如图         就这四种情况,其中头两种总共就是两个序列,也就是从头到尾递增和从头到尾递减.         后两种方式就是把序列中德数分为左右两派,分完以后左右两边各自内部的排法就已经确定了,至于ai早就确定了(不是全局最大就是全局最小),而除了ai的每一个数都有选择在左或是在右两种选择,所以是2^(n-1),总共就是2^n,而这里包括了前两种的方案,所以要-4,最终应有2^n-2种.         看数据范围就知道要用快速幂,不

hdu 1452 Happy 2004 (快速幂+取模乘法逆元)

Problem Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29).Take X = 1 for an example. The positive integer divisors of

codevs1281 矩阵乘法 快速幂 !!!手写乘法取模!!! 练习struct的构造函数和成员函数

对于这道题目以及我的快速幂以及我的一节半晚自习我表示无力吐槽,, 首先矩阵乘法和快速幂没必要太多说吧,,嗯没必要,,我相信没必要,,实在做不出来写两个矩阵手推一下也就能理解矩阵的顺序了,要格外注意一些细节,比如快速幂时ans矩阵的初始化方式,快速幂的次数,矩阵乘法过程中对临时矩阵的清零,最后输出结果时的初始矩阵...矩阵快速幂好理解但是细节还是有点小坑的.. 下面就是满满的槽点,,高能慎入!!! 对于这个题目要求矩阵过程中对m取模,结果对g取模,我表示难以接受,,上来没看清题直接wa19个点,另