题解luoguP2054 BZOJ1965【[AHOI2005]洗牌】
题目链接:
思路:
首先一开始我看错题了,但是发现了一些有趣的东西:
我一开始理解的意思:第L张扑克牌的牌面大小是多少
这是题目要我们求得,然后我看成了原序列中第L张扑克牌的位置...然后兴冲冲地找到了规律,比较有趣: $pos \equiv (L*2^m) mod (n+1)$,具体怎么证我不会,可惜数竞大佬都去集训了,现在也没办法。
然后按这个规律交了一发只有10分,才发现看错题了。我们要求的是m次洗牌后第L张扑克牌的牌面大小,然而刚刚我们已经发现了$pos \equiv (L*2^m) \pmod {n+1}$
于是我们设位于L位,即现在位置(pos)在L上的牌在原序列第x张,根据上面规律:$(x*2^m) \equiv L \pmod {n+1}$
所以 $x \equiv L*{2^m}^{-1} \pmod {n+1} $,求出$2^m$在模$(n+1)$意义下的逆元即可。
- 其他:
这里不用$(n+1)$不一定是质数,所以最好不要用费马小定理求,否则你只有40分,然后我们就只能用拓欧了
同时我发现当m满足$2^m \equiv 1 \pmod {n+1}$时,恰好变成最开始的序列,然而我还是不会证明
- 代码:
include
include
include
include
include
include
define ll long long
using namespace std;
ll quick_pow(int a,int b,int c)//a^b%c
{
if(b0)return 1;
ll x=quick_pow(a,b>>1,c);
x=xx%c;
if(b&1)x=xa%c;
return x;
}
void ex_gcd(ll a, ll b, ll &x, ll &y, ll &d){
if (!b) {d=a,x=1,y=0;}
else{
ex_gcd(b,a%b,y,x,d);
y=y-x*(a/b);
}
return ;
}
ll inv(ll t, ll p){
ll d,x,y;
ex_gcd(t,p,x,y,d);
return (x%p+p)%p;
}
int main(){
ll n,m,l;
cin>>n>>m>>l;
ll p=quick_pow(2,m,n+1);
if(p%(n+1)1){
printf("%lld",l);
}
else{
printf("%lld\n",(l*inv(p,n+1))%(n+1));
}
return 0;
}
题解luoguP2054 BZOJ1965【[AHOI2005]洗牌】的更多相关文章
- [BZOJ1965][AHOI2005] 洗牌 - 扩展欧几里得
题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...
- bzoj1965 [Ahoi2005]洗牌
Description 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联 ...
- 【BZOJ1965】[AHOI2005]洗牌(数论)
[BZOJ1965][AHOI2005]洗牌(数论) 题面 BZOJ 洛谷 题解 考虑反过来做这个洗牌的操作,假定当前牌是第\(l\)张. 因为之前洗的时候考虑了前一半和后一半,所以根据\(l\)的奇 ...
- [luogu P2054] [AHOI2005]洗牌
[luogu P2054] [AHOI2005]洗牌 题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学 ...
- P2054 [AHOI2005]洗牌
P2054 [AHOI2005]洗牌 题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度 ...
- 洛谷——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$ 手推一下样例,你就会发现是有规律的: ...
- 洛谷P2054 [AHOI2005]洗牌(扩展欧几里德)
洛谷题目传送门 来个正常的有证明的题解 我们不好来表示某时刻某一个位置是哪一张牌,但我们可以表示某时刻某一张牌在哪个位置. 设数列\(\{a_{i_j}\}\)表示\(i\)号牌经过\(j\)次洗牌后 ...
- BZOJ 1965 [AHOI2005]洗牌
题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...
- [AHOI2005]洗牌
题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...
随机推荐
- Mac 卸载mysql
sudo rm /usr/local/mysql sudo rm -rf /usr/local/mysql* sudo rm -rf /Library/StartupItems/MySQLCOM su ...
- 微信小程序跳转问题:wx.redirectTo、wx.navigateTo、wx.reLaunch、wx.switchTap、wx.navigateBack区别
wx.redirectTo:关闭当前页,跳转到指定页: wx.navigateTo:保留当前页,跳转到指定页: wx.reLaunch:关闭所有页面,打开到应用内的某个页面. wx.switchTap ...
- 使用Pull解析器生成XML文件
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...
- Vue.js父子组件如何传值 通俗易懂
父子组件传值原理图 一般页面的视图App.vue应为这样 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue 2.Child.vue的中创建pr ...
- 用Python计算三角函数之acos()方法的使用
用Python计算三角函数之acos()方法的使用 acos()方法返回x的反余弦值,以弧度表示. 语法 以下是acos()方法的语法: acos(x) 注意:此函数是无法直接访问的,所以我们 ...
- 导入现有java工程
1)错误:点击File-->open File 这样只能导入单个文件: 2)正确:File-->Import--> 然后下一步下一步即可.
- kNN进邻算法
一.算法概述 (1)采用测量不同特征值之间的距离方法进行分类 优点: 精度高.对异常值不敏感.无数据输入假定. 缺点: 计算复杂度高.空间复杂度高. (2)KNN模型的三个要素 kNN算法模型实际上就 ...
- C#大文件流式压缩加解密
* * , CancellationToken token=default) { try { FileStream zipStream = new FileStream(writeFile, File ...
- TypeError: __init__() got an unexpected keyword argument 'serialized_options'
问题描述: TypeError: __init__() got an unexpected keyword argument 'serialized_options' File "objec ...
- cm api
cm API:https://github.com/cloudera/cm_api/tree/master/python/examples/auto-deploy#看集群有几个clustercurl ...