[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] 左右的更多相关文章
随机推荐
- 使用Canvas和JavaScript做一个画板
本文同步于个人博客:https://zhoushuo.me/blog/2018/03/11/drawing-borad/ 前些天学习了HTML5的<canvas>元素,今天就来实践一下,用 ...
- python-查找鞍点
[题目描述]对于给定5X5的整数矩阵,设计算法查找出所有的鞍点的信息(包括鞍点的值和行.列坐标,坐标从1开始). 提示:鞍点的特点:列上最小,行上最大. [练习要求]请给出源代码程序和运行测试结果 ...
- CCF201909-2小明种苹果(续)
解题思路:解题思路很简答,就是用数组将数据存起来然后再进行统计,具体思路就见代码注释,记录这道题的是为了警示自己好好审题啊...... 审题有问题,写题火葬场啊.......以为每棵树就疏一次果,把D ...
- vue行内动态添加样式或者动态添加类名
还是记录一下吧(๑•ᴗ•๑) <li :style="{backgroundImage:`url(${item.pic})`}" @click="chooseVip ...
- vue后台管理系统组件弹窗
//addFormVisibleIcon可在data中设置true与falsehttps://element.eleme.io/#/zh-CN/component/installation <e ...
- 利用es6解构赋值快速提取JSON数据;
直接上代码 { let JSONData = { title:'abc', test:[ { nums:5, name:'jobs' }, { nums:11, name:'bill' } ] } l ...
- AcWing 1222. 密码脱落
题目链接 题目描述: X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于 ...
- python---运算符和编码
格式化输出 在输出数据时,会有用户需要输入的信息被输出,没办法预先知道,这就需要使用格式化输出.先在相应位置放置一个占位符,再把字符串里的占位符与外部的变量做个映射关系. name = input(& ...
- SpringMVC的数据响应方式
1.页面跳转 *直接返回字符串 *通过ModelAndView对象返回 2.回写数据 *直接返回字符串 *返回对象或集合
- php怎么向上取整以5为界
public function test(){ $number = 52093; var_dump( $this->roundNumberVariant( ( int ) $number ) ) ...