题目链接:左右

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] 左右的更多相关文章

随机推荐

  1. python去除txt文件空白行

    代码: def delblankline(infile, outfile): infopen = open(infile, 'r', encoding="utf-8") outfo ...

  2. EMS设置发送连接器和接收连接器邮件大小

    任务:通过EMS命令设置发送接收连接器和接收连接器的邮件大小限制值为50MB. 以Exchange管理员身份打开EMS控制台.在PowerShell命令提示符下. 键入以下命令设置接收-连接器的最大邮 ...

  3. python---重建二叉树

    """ 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. 假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5, ...

  4. docker下将容器按照端口号分配

    问题情境:现在有一个服务器主机,安装了docker,想给成员分配各自的容器,但不想成员通过宿主机进入容器.那么成员如何直接访问容器呢? 成员可以通过ip加端口号访问 因此,需要生成一个容器,将容器的2 ...

  5. spring-注入list集合对象(值是对象)

    1.创建stu类 public class Stu { // //1.数组类型 // private String[] courses; // // //2.list集合属性 // private L ...

  6. rabbitmq简单运用

    <?php /** * 生产者 */ $connection = new AMQPConnection([ 'host' => '192.168.23.130', 'port' => ...

  7. Springboot之Actuator的渗透测试和漏洞利用

    背景概述 Spring的生态很优秀,而使用Spring Boot的开发者也比较多. Actuator是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动 ...

  8. .NET 7 Preview 3添加了这些增强功能

    .NET 7 Preview 3 已发布, .NET 7 的第三个预览版包括对可观察性.启动时间.代码生成.GC Region.Native AOT 编译等方面的增强. 有兴趣的用户可以下载适用于 W ...

  9. css 动画 (2)

    1. html 结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  10. mmdetection 绘制PR曲线

    参考:https://github.com/xuhuasheng/mmdetection_plot_pr_curve 适用于COCO数据集 import os import mmcv import n ...