当前位置: 首页 > news >正文

[vijos1554bzoj1411]硬币游戏快速幂

题目链接:https://vijos.org/p/1554

    http://www.lydsy.com/JudgeOnline/problem.php?id=1411

这题真的淫*QAQ。。。

一看题还以为是啥水题,结果啊,是个规律题

我们先来解释一下样例

20202010101010101020   0
01010201010101010201   1
10102020101010102020   2
01020102010101020102   3
20202020201010202020   4
01010101020102010101   5
10101010202020201010   6
01010102010101020101   7
10101020201010202010   8
01010201020102010201   9
10102020202020202020   10
01020101010101010102   11

这后面的数字表示的是第几次操作

然后可以开始找规律了。。。。。。。。。

盯-----------------------------------------------------------------------------------------------------

这个看起来头有点痛,我们优化一波来看

20202010101010101020   0

10102020101010102020   2

20202020201010202020   4

10101010202020201010   6

10101020201010202010   8

10102020202020202020   10

其实我们就可以发现,这个每两次操作,硬币的位置是不会变的,变的只是正反面

然后我们在把这个图继续变换

20202010101010101020   0

10102020101010102020   2

20202020201010202020   4

10101020201010202010   8

我们只留下了2^k次方这些操作

就可以发现,第2^k次方次操作中,第i个数是由最开始的i-2^k和i+2^k这两个数来决定的

所以对于操作次数T

要把T分解成2^k+2^k-1+···+2^1+1这种形式的

其实吧,这就是快速幂

然后快乐的写一个快速幂模板就过了

只是注意一下T是2^60,要用long long存

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cstdlib>
 6 #include<queue>
 7 #include<cmath>
 8 #define maxn 200005
 9 using namespace std;
10 
11 int n;
12 long long x,d=1;
13 int a[maxn*2],b[maxn*2];
14 
15 int did(int pos,long long dis){
16     int l=((pos-dis)%n+n)%n,r=(pos+dis)%n;
17     //pos-dis有可能<-n; 
18     if(l==0)l=n;if(r==0)r=n;
19     if(a[l]==0)return 0;
20     if(!(a[l]^a[r]))return 1;
21     return 2;
22 }
23 
24 void work(){
25     while(x){
26         if(x&1){
27             for(int i=1;i<=n;i++)
28                 b[i]=did(i,d);
29             for(int i=1;i<=n;i++)
30                 a[i]=b[i];            
31         }
32         x>>=1;d<<=1;
33     }
34 }
35 
36 int main(){
37     scanf("%d%lld",&n,&x);n<<=1;
38     for(int i=1;i<=n;i+=2){
39         scanf("%d",&a[i]);
40     }
41     work();
42     for(int i=1;i<n;i++){
43         printf("%d ",a[i]);
44     }printf("%d",a[n]);
45 } 
View Code

【总结】

然后看见我的注释没,我就在那里卡了很久,因为我最开始的L是(pos-dis+n)%n;

然后光荣爆炸,毕竟,我没算到pos-dis的绝对值可能是小于n的啊

所以那个位置的正确写法((pos-dis)%n+n)%n;

 

转载于:https://www.cnblogs.com/Danzel-Aria233/p/7794345.html

相关文章:

  • iPhone X Web 设计
  • 使用isolation forest进行dns网络流量异常检测
  • nginx 开机自动启动
  • Python监控服务器利器--psutil
  • 主线程退出,子线程会退出么?
  • apue读书笔记之apue.h的设置
  • rpm 安装中的问题
  • 编程学习初体验(3. 语言的选择)
  • oracle12C—RMAN表级恢复
  • 黑客的思想
  • RPC协议
  • 命令行工具软件
  • 腾讯云ubuntu安装tensorflow
  • Python垃圾回收机制:gc模块
  • Silverlight Client←→Server数据同步备忘代码
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Docker容器管理
  • Fastjson的基本使用方法大全
  • JavaScript HTML DOM
  • leetcode-27. Remove Element
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • use Google search engine
  • vue学习系列(二)vue-cli
  • 订阅Forge Viewer所有的事件
  • 用mpvue开发微信小程序
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 正则与JS中的正则
  • mysql面试题分组并合并列
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • # 计算机视觉入门
  • (0)Nginx 功能特性
  • (4)STL算法之比较
  • (4)事件处理——(7)简单事件(Simple events)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (推荐)叮当——中文语音对话机器人
  • (转)nsfocus-绿盟科技笔试题目
  • (转)甲方乙方——赵民谈找工作
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core 中的路径问题
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 常见的偏门问题
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • @RequestMapping处理请求异常
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [ACM] hdu 1201 18岁生日
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [HNOI2010]BUS 公交线路
  • [HTML API]HTMLCollection
  • [IE技巧] 让IE 以全屏模式启动