HDU 5187 思维+快速幂模板
来源:互联网 发布:大宗交易数据查询 编辑:程序博客网 时间:2024/05/22 03:43
题目链接
题意
给n个数字,从1到n,现在定义一种排列,满足一下两个条件
- 从{1-i}的排列是单调排列
- 从{i-n}的排列是单调排列
给定n和p求这种排列的个数模上p的结果
解法
- 如果i这个位置的数是不是1且不是n,那么只有从1-n的排列和从n到1的排列,有2种(其实包含在二和三中)
- 如果是1那么能形成的排列是1的两边都是单调递减,因为所有的数都大于1,每个数都可能在1的左边或者右边,总共有2的 2^(n-1) 种
- 同理,如果是n也是 2^(n-1) 种
- 然后发现第二种情况与第三种情况完全包含了第一种情况 , 同时第二种和第三种情况有完全重合的地方,也就是1在最左边那么n肯定就在最右边,同时n在最左边那么1肯定就在最右边,有二种是重复的
- 所以总的个数为 2^n - 2
注意
- 这个题目的n和p相当的大,有10^18
- 所以普通的快速幂是会爆的
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cassert>using namespace std ;typedef long long LL ;LL Mod ;LL mul(LL n , LL k) { LL ans = 0 ; n %= Mod ; while(k) { if(k&1) { ans += n ; if(ans > Mod) ans -= Mod ;//此处 } n <<= 1 ; if(n > Mod) n -= Mod ;//以及此处如果是去模运算700+ms ,减法则是70+ms k >>= 1 ; } return ans ;}LL pow_mul(LL n , LL k) { LL ans = 1 ; while(k) { if(k&1) ans = mul(ans , n) ; n = mul(n , n) ; k >>= 1 ; } return ans ;}int main() { LL n ; while(scanf("%I64d%I64d" , &n ,&Mod) == 2) { if(n == 1) { printf("%I64d\n" , n%Mod) ; continue ; } printf("%I64d\n" , (pow_mul(2 , n)-2+Mod)%Mod) ; }}
0 0
- HDU 5187 思维+快速幂模板
- Hdu 5187 zhx's contest【思维+快速幂+快速乘】
- HDU 4602 Partition (快速幂+思维)
- HDU 5690 All X 【思维快速幂】
- HDU 5187 zhx's contest(思维,快速幂,快速乘)
- HDU 1395(快速幂模板)
- hdu 2604 矩阵快速幂模板题
- hdu 1005 矩阵快速幂模板题
- hdu 1575 矩阵快速幂模板题
- HDU --- 5015 233 Matrix 【思维 + 矩阵快速幂】
- 【hdu 4062】Queuing 【思维+递推+矩阵快速幂】
- hdu 5666 Segment【思维+快速积】
- hdu 5187(快速幂)
- hdu 5187 快速幂
- hdu 4965 Fast Matrix Calculation【矩阵快速幂模板】
- hdu 5015 矩阵快速幂(可用作模板)
- hdu 5411 多校——矩阵快速幂模板
- HDU 1757 A Simple Math Problem (矩阵快速幂模板)
- c常用函数
- Chart Controls 简介与下载
- Windows注册服务工具使用
- 一道代数题
- 开启博客之旅
- HDU 5187 思维+快速幂模板
- 如何在win7下安装XP系统?
- Hadoop 配置及hadoop HA 的配置
- 启动Tomcat提示:指定的服务未安装
- 函数的增长
- path和classpath环境变量的配置目的及其配置的必要性说明
- hdu 5186 zhx's submissions
- 在Ubuntu 14.04 64bit下用Python搭建数据科学研究环境
- URAL 1725. Sold Out!(数学啊 )