博客
关于我
bzoj 1965: [Ahoi2005]SHUFFLE 洗牌
阅读量:274 次
发布时间:2019-03-01

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

题意:

xjb洗m次扑克,问第l为上的数是什么。

题解:

第一眼数据范围,什么,好大啊, O(n) 都不行。

一开始我是这么想的,写个递推,然后找循环节优化。
递推还是蛮好写的:

LL f(LL i,LL j){    if(i==0) return j;    if(j%2==0) return f(i-1,j/2);    else return f(i-1,(j+1+n)/2);}

f(i,j) 表示洗i次牌后,第j位上的数是什么。

但是好像不可优化啊。可能是我太菜了
于是换一种思维,从前往后推,考虑第x位上的数经过一次洗牌后到哪一位。
得到 x>2x(x<=n2),x>2xn1(x>n2)
整理得到 x>2x mod (n+1)
所以列出同余方程 2mxL(modn+1)
扩展欧几里得直接上就好了。
code:

#include
#include
#include
#define LL long longusing namespace std;LL mod;LL n,m,l;LL exgcd(LL a,LL b,LL &x,LL &y){ if(a==0){x=0;y=1;return b;} LL tx,ty,d; d=exgcd(b%a,a,tx,ty); x=ty-(b/a)*tx;y=tx; return d;}LL cheng(LL a,LL b){ LL ans=0; while(b) { if(b&1) (ans+=a)%=mod;; (a+=a)%=mod;b>>=1; } return ans;}LL quick(LL a,LL b){ LL ans=1LL; while(b) { if(b&1) ans=cheng(ans,a); a=cheng(a,a);b>>=1; } return ans;}int main(){ scanf("%lld %lld %lld",&n,&m,&l); mod=n+1; LL A=quick(2LL,m),B=mod,C=l; LL x,y,d=exgcd(A,B,x,y); printf("%lld",(x*(C/d)%(B/d)+(B/d))%(B/d));}

转载地址:http://snza.baihongyu.com/

你可能感兴趣的文章
nginx反向代理解决跨域问题,使本地调试更方便
查看>>
Nginx反向代理配置
查看>>
Nginx启动SSL功能,并进行功能优化,你看这个就足够了
查看>>
nginx启动脚本
查看>>
Nginx在Windows上和Linux上(Docker启动)分别配置基本身份认证示例
查看>>
Nginx在Windows下载安装启动与配置前后端请求代理
查看>>
Nginx多域名,多证书,多服务配置,实用版
查看>>
nginx如何实现图片防盗链
查看>>
Nginx学习总结(12)——Nginx各项配置总结
查看>>
Nginx学习总结(13)——Nginx 重要知识点回顾
查看>>
Nginx学习总结(14)——Nginx配置参数详细说明与整理
查看>>
nginx学习笔记002---Nginx代理配置_案例1_实现了对前端代码的方向代理_并且配置了后端api接口的访问地址
查看>>
Nginx安装与常见命令
查看>>
Nginx安装及配置详解
查看>>
nginx安装配置
查看>>
Nginx实战经验分享:从小白到专家的成长历程!
查看>>
Nginx实现反向代理负载均衡
查看>>
nginx实现负载均衡
查看>>
nginx常用命令及简单配置
查看>>
nginx开机启动脚本
查看>>