博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ1956】[Ahoi2005]SHUFFLE 洗牌
阅读量:5214 次
发布时间:2019-06-14

本文共 944 字,大约阅读时间需要 3 分钟。

 题目描述:

  

这道题,我们首先一眼瞪出来一个规律:对于一个位置为i的牌,在1次洗牌后,他的位置处于(i*2)%(n+1) 的位置

那么,显然的,对于M次洗牌 我们只需要求出2的m次方,这个我们采用快速幂。

那么 我们的主要目的,就是找到一个X 使  

成立

那么 我们就需要用到2^m的逆元,这个n+1不一定是素数,有点不太好搞啊……

 

不过没关系!我们看到,这个数字的底数为2 而n+1一定为奇数·(n为偶数) 下面请记住一个结论

对于一个奇数n ,2在膜n意义下的逆元是(n-1)/2+1 这个很好证明,把它乘2就是n+1 膜n意义下为1 符合逆元的定义

 

于是这道题就变得简单起来了:求n/2+1的m次方(mod n+1) 把它与l相乘,得到的就是x了!

 

上代码:

#include
#include
typedef unsigned long long ull;ull n,m,l;ull qpow(ull a,ull m) { ull base = a,ans=1; while(m) {#ifdef DEBUG printf("%llu %llu",ans,base);#endif if(m&1) (ans*=base)%=n+1; (base*=base)%=n+1;m>>=1; } return ans;}ull after(ull n,ull p) { return n*p%(n+1);}ull inv(ull p) { return qpow(p,n-1);}int main() { scanf("%llu%llu%llu",&n,&m,&l); ull p = qpow((n/2)+1,m);#ifdef DEBUG printf("%llu\n",p);#endif printf("%llu",l*p%(n+1)); return 0;}
View Code

 

转载于:https://www.cnblogs.com/Syameimaru/p/9301727.html

你可能感兴趣的文章
OO第四单元总结暨学期总结
查看>>
mysql5.7慢查询开启配置
查看>>
关于Android Force Close 出现的原因 以及解决方法
查看>>
收藏几个好的博文
查看>>
Spring中AOP的两种代理方式(Java动态代理和CGLIB代理-转载
查看>>
Ubuntu17.04下安装vmware虚拟机
查看>>
ProjectEuler 9
查看>>
中文编程
查看>>
软件开发方法
查看>>
Dllregisterserver调用失败解决方法
查看>>
Java文件操作大全
查看>>
数据结构&算法实践—【排序|插入排序】插入排序
查看>>
图的应用详解-数据结构
查看>>
WPF中播放视频音频
查看>>
linux下配置固定ip
查看>>
MsSql 游标 修改字段两个表关联 表向另个表插入记录
查看>>
Atlas命名空间Sys.Data下控件介绍——DataColumn,DataRow和DataTable
查看>>
一个简单驱动的makefile
查看>>
《宁夏文学六十年》读后
查看>>
几款实力很强的小工具,提高Windows使用效率
查看>>