[XJOI3529] 左右
题目链接:左右
Description
给你一个s数组,一个t数组,你可以对s数组执行以下两种操作
L 操作:每个数等于其左边的数加上自己
R 操作:每个数等于其右边的数加上自己
第一个数的左边是最后一个数,最后一个数的右边是第一个数
对于每个操作,所有的加法是同时进行的,即(new)s[i] = (old)s[i - 1] + (old)s[i]
现在问你s数组能否变成t数组。
数据范围 \(1\le n\le 50, 1\le s_i, t_i\le 10^{15}\)
Solution
引理:只要确定了\(L\)和\(R\)的次数,无论按什么顺序操作,最终序列都相同。
我们将这个数列视为一个多项式,并以\(0,1,...,n-1\)作为下标,则:
序列为\(a_0,a_1x,a_2x^2,...,a_{n-1}x^{n-1}\)
\(L\)操作等价于这个式子乘以\((1+x)\),指数对\(n\)取模。
\(R\)操作等价于这个式子乘以\((1+x^{n-1})\),指数对\(n\)取模。
我们发现,\(L\)和\(R\)操作的顺序并不影响序列的结果。
那么我们可以暴力枚举\(L\)和\(R\)的次数,并且直接模拟即可。
注意到,因为上限是\(10^{15}\),所以最多只需要\(L\)和\(R\)操作\(log\)次即可。
复杂度 \(O(n^3)\),跑不满。
Code
// Author: wlzhouzhuan
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define rint register int
#define rep(i, l, r) for (rint i = l; i <= r; i++)
#define per(i, l, r) for (rint i = l; i >= r; i--)
#define mset(s, _) memset(s, _, sizeof(s))
#define pb push_back
#define pii pair <int, int>
#define mp(a, b) make_pair(a, b)
inline int read() {
int x = 0, neg = 1; char op = getchar();
while (!isdigit(op)) { if (op == '-') neg = -1; op = getchar(); }
while (isdigit(op)) { x = 10 * x + op - '0'; op = getchar(); }
return neg * x;
}
inline void print(int x) {
if (x < 0) { putchar('-'); x = -x; }
if (x >= 10) print(x / 10);
putchar(x % 10 + '0');
}
const int N = 102;
ll a[N], b[N], n;
ll c[N], d[N];
bool check() {
for (int i = 1; i <= n; i++) if (c[i] != b[i]) return 0;
return 1;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
for (int a1 = 0; a1 <= 50; a1++) {
for (int i = 1; i <= n; i++) c[i] = a[i];
int ok = 1;
for (int k = 1; k <= a1; k++) {
for (int i = 1; i <= n; i++) d[i] = c[i] + c[i == 1 ? n : i - 1];
for (int i = 1; i <= n; i++) {
c[i] = d[i];
if (c[i] > b[i]) {
ok = 0;
break;
}
}
}
if (!ok) continue;
int a2 = 50;
while (a2--) {
if (check()) {
puts("Yes");
exit(0);
}
for (int i = 1; i <= n; i++) d[i] = c[i] + c[i == n ? 1 : i + 1];
for (int i = 1; i <= n; i++) {
c[i] = d[i];
if (c[i] > b[i]) {
break;
}
}
}
}
puts("No");
return 0;
}
[XJOI3529] 左右的更多相关文章
随机推荐
- JavaScript实现简单轮播图动画
运行效果: 源代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset=&quo ...
- 设置IDEA启动时不打开上次项目
步骤 1.启动IDEA,点击File 2.点击setting,在Appearance&Behavior中找到System Setting 3.取消勾选Reopen projects on st ...
- Mysql学习day1
安装了Mysql以及SQLyog,将SQLyog和数据库做了连接. 学习了基础数据类型以及命令行语句 1 alter table `student` rename as `stu``lesson` 2 ...
- JavaScript学习总结3-函数
JS如果没能完return,等函数完全执行完毕也会返回NaN(undefined) 因为JS高度自由性,不像C.C++.Java等,函数传参有较严格的限制,JS可以完函数内传任意数量个参数,也可以不传 ...
- Java学习day29
线程礼让(yield):礼让线程,让当前正在执行的线程暂停,但是不阻塞:让线程从运行状态转为就绪状态:让CPU重新调度,礼让不一定成功 合并线程(join):待此线程执行完毕后,再执行其他线程,其他线 ...
- Hyperledger Fabric无排序组织以Raft共识算法启动多个Orderer服务、多组织共同运行维护Orderer服务
前言 在Hyperledger Fabric无系统通道启动及通道的创建和删除中,我们已经完成了以无系统通道的方式启动 Hyperledger Fabric 网络,并将链码安装到指定通道.但目前为止,实 ...
- python黑帽子(第五章)
对开源CMS进行扫描 import os import queue import requests # 原书编写时间过于久远 现在有requests库对已经对原来的库进行封装 更容易调用 import ...
- Ubuntu 下 firebird 数据库的安装和配置
Ubuntu 下 firebird 数据库的安装和配置 1.简介 本文主要是 Ubuntu 下 firebird 数据库的安装和目录迁移,同样适用于 Debian 系统:Ubuntu 20.0.4 f ...
- Envoy熔断限流实践(二)Rainbond基于RLS服务全局限流
Envoy 可以作为 Sevice Mesh 微服务框架中的代理实现方案,Rainbond 内置的微服务框架同样基于 Envoy 实现.本文所描述的全局限速实践也是基于 Envoy 已有的方案所实现. ...
- Spark SQL底层执行流程详解
本文目录 一.Apache Spark 二.Spark SQL发展历程 三.Spark SQL底层执行原理 四.Catalyst 的两大优化 一.Apache Spark Apache Spark是用 ...