洛谷——P2054 [AHOI2005]洗牌(扩展欧几里得,逆元)
P2054 [AHOI2005]洗牌
扩展欧拉定理求逆元
$1 2 3 4 5 6$
$4 1 5 2 6 3$
$2 4 6 1 3 5$
$1 2 3 4 5 6$
手推一下样例,你就会发现是有规律的:
位置->位置
$1->2$
$2->4$
$3->6$
$4->1$
$5->3$
$6->5$
规律显然,位于位置$x$的数,进行一次洗牌操作位置就会变成$x*2\%(n+1)$
那么位于$x$的数,经过$m$次操作,位置就会变成$x*2^m\%(n+1)$
那么可以列出一下同余方程
$x*2^m≡k(mod(n+1))$
然后就比较显然了,只有一个未知数$x$,扩展$gcd$好了,=_=,博主太蒟,没有看懂
另一种解释方法是:
变换一下得:$x≡k*{2^{m}}^{-1}(mod(n+1))$
问题就转换成了求解${2^{m}}$在$\%(n+1)$意义下的逆元,还是$exgcd$
$ans={2^{m}}^{-1}*l\%(n+1)$
#include<iostream>
#include<cstdio> #define LL long long
using namespace std; LL n,m,l;
LL pow(LL a,LL b){
LL s=;
for(;b;b>>=,a=a*a%(n+))
if(b&) s=s*a%(n+);
return s;
} LL exgcd(LL a,LL b,LL &x,LL &y){
if(!b){x=,y=;return a;}
LL gc=exgcd(b,a%b,x,y);
LL tmp=x;x=y;y=tmp-a/b*y;
return gc;
} int main()
{
scanf("%lld%lld%lld",&n,&m,&l);
LL m_2=pow(,m);
LL x,y;
exgcd(m_2,n+,x,y); printf("%lld\n",(x*l%(n+)+(n+))%(n+)); return ;
}
洛谷——P2054 [AHOI2005]洗牌(扩展欧几里得,逆元)的更多相关文章
- [BZOJ1965][AHOI2005] 洗牌 - 扩展欧几里得
题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...
- 洛谷P2054 [AHOI2005]洗牌(扩展欧几里德)
洛谷题目传送门 来个正常的有证明的题解 我们不好来表示某时刻某一个位置是哪一张牌,但我们可以表示某时刻某一张牌在哪个位置. 设数列\(\{a_{i_j}\}\)表示\(i\)号牌经过\(j\)次洗牌后 ...
- 洛谷 P2054 [AHOI2005]洗牌
题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...
- BZOJ 1965 洗牌(扩展欧几里得)
容易发现,对于牌堆里第x张牌,在一次洗牌后会变成2*x%(n+1)的位置. 于是问题就变成了求x*2^m%(n+1)=L,x在[1,n]范围内的解. 显然可以用扩展欧几里得求出. # include ...
- 洛谷P2421 [NOI2002]荒岛野人(扩展欧几里得)
题目背景 原 A-B数对(增强版)参见P1102 题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,… ...
- [luogu P2054] [AHOI2005]洗牌
[luogu P2054] [AHOI2005]洗牌 题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学 ...
- P2054 [AHOI2005]洗牌
P2054 [AHOI2005]洗牌 题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度 ...
- 【BZOJ1965】[AHOI2005]洗牌(数论)
[BZOJ1965][AHOI2005]洗牌(数论) 题面 BZOJ 洛谷 题解 考虑反过来做这个洗牌的操作,假定当前牌是第\(l\)张. 因为之前洗的时候考虑了前一半和后一半,所以根据\(l\)的奇 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
随机推荐
- Swing中子元素截获MouseEvent问题
在父元素中绑定MouseMotion监听,但是当鼠标在子元素中时父元素无法收到 这时候需要在子元素中绑定MouseMotion,然后使用: getParent().dispatchEvent(e); ...
- hdu 6035(树形dp)
题意:给你棵树,树上每个节点都有颜色,每条路径上有m种颜色 问你所有路径上出现的颜色的和 思路:答案求的是每种颜色对路径的贡献 我们可以反过来每种颜色不经过的路径的条数 假设根节点的颜色为x 我 ...
- SPI操作flash MX25L64读写数据
STM32F10X SPI操作flash MX25L64读写数据 简单的一种应用,ARM芯片作为master,flash为slaver,实现单对单通信.ARM主控芯片STM32F103,flash芯片 ...
- Java:EL表达式
ylbtech-Java:EL表达式 EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...
- Java序列化系列教程(下)
一引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口 ...
- VS2015 framework4.5代码提示英文切换为中文
输入下面的地址,复制里面所有的文件 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0 ...
- 题解报告:hdu 1061 Rightmost Digit(快速幂取模)
Problem Description Given a positive integer N, you should output the most right digit of N^N. Input ...
- java 分解整数 【个 十 百】(数组案例)
求一个数两位数的个位数,十位数,百位数及千位: int num = 53; int g = (num / 1) % 10; //个位 int s = (num / 10) % 10; //十位 in ...
- 专题七:UDP编程补充——UDP广播程序的实现
一.程序实现 UDP广播程序的实现代码: using System; using System.Net; using System.Net.Sockets; using System.Text; us ...
- cocos2dx在windows下搭建环境android报错
报错:Program bash is not found in PATH (如果按照我的方法来的话是没有这个错误的,我之前用别的方法的时候有但是后来还是没解决,写出来放到这里做参考吧) 参考原文: ...