Codeforces Round #698 (Div. 2) D. Nezzar and Board(一步步推出来,超级清晰,不猜结论,看不懂来打我 ~ 好题 )
整理的算法模板合集: ACM模板
点我看算法全家桶系列!!!
D - Nezzar and Board
Problem A Nezzar and Board
我们在黑板上写了 nnn 个数,x1,x2,⋯,xnx_1,x_2,\cdots,x_nx1,x2,⋯,xn。
我们可以无限此地使用一个操作:从黑板上的数字中选择两个数 xxx 和 yyy (xxx 和 yyy 可以是同一个数)将 2x−y2x-y2x−y 写到黑板上去(xxx 和 yyy 还在)。求整数 KKK 能否被写到黑板上去。
1≤T≤105,1≤k,xi≤10181\le T\le10^5,1\le k,x_i\le10^{18}1≤T≤105,1≤k,xi≤1018.
Solution
我这里不需要猜结论或者证明结论,我的解法只需要一步步按部就班地往后推就行了。
首先我们知道每次可以选择两个数 xxx 和 yyy 得到 2x−y2x-y2x−y。
这个 2x−y2x-y2x−y 看上去毫无头绪,因为一个乘以二,一个是本身,两个好像和 xxx 与 yyy 毫无关系。我们可以把它们拆开,得到 x+(x−y)x+(x-y)x+(x−y)。
逐渐好起来了,看上去有些头绪了,因为这里实际上表示的是从一个数 xxx 开始,加上这个数与另一个数的差值,然后得到了一个新数。
我们可以模拟一下:
我们假设:
xi=xj+(xj−xk)x_i=x_j+(x_j-x_k)xi=xj+(xj−xk)
xa=xi+(xi−xc)x_a=x_i+(x_i-x_c)xa=xi+(xi−xc)
xb=xa+(xa−xd)x_b=x_a+(x_a-x_d)xb=xa+(xa−xd)
那么 xbx_bxb 就可以表示为:
xb=xj+(xj−xk)+(xi−xc)+(xa−xd)x_b=x_j+(x_j-x_k)+(x_i-x_c)+(x_a-x_d)xb=xj+(xj−xk)+(xi−xc)+(xa−xd)
我们可以从特殊到一般,得到所有能写到黑板上的数的表达式(为了理解方便,看起来舒服,我们就设能写到黑板上的数为我们题目中想要我们来判断的 KKK):
那么我们得到了一个表达式:
xi+∑j,k(xj−xk)=Kx_i+\sum_{j,k}(x_j-x_k)=Kxi+∑j,k(xj−xk)=K
其中 j,kj,kj,k 可以是我们得到 KKK 的途中使用的任意一个数的下标,甚至 xix_ixi 可以替换为任意一个 xxx ,这一点我们下面再详细说明。
特别的,由于题目中特别说明了可以每次选的两个数 xxx 和 yyy 可以是同一个数(" not necessarily distinct ")所以我们这个表达式不仅可以表示新写到黑板上的数,还可以表示原来就在黑板上的数:x=x+(x−x)x=x+(x-x)x=x+(x−x)。
这样我们得到的这个表达式就可以表示所有的黑板上的数字了。
我们可以把左边的 xix_ixi 移到右边,这样两边的形式看上去统一一些,并且也不会影响答案的正确性。
即:
∑j,k(xj−xk)=K−xi\sum_{j,k}(x_j-x_k)=K-x_ij,k∑(xj−xk)=K−xi
其中, xix_ixi 可以换为 x1x_1x1 ,因为不管 xix_ixi 是谁,我们都可以移动到左边,变成正数 xix_ixi,而黑板上的任意一个数都可以由 x1x_1x1 通过两次操作得到,例如我们想由 x1x_1x1 得到 xnx_nxn :
第一次操作: 选择 x1x_1x1 和 xnx_nxn ,得到新数:x1+(x1−xn)x_1+(x_1-x_n)x1+(x1−xn),写到黑板上。
第二次操作: 选择 x1x_1x1 和 x1+(x1−xn)x_1+(x_1-x_n)x1+(x1−xn) ,得到:x1+{x1−[x1+(x1−xn)]}=x1+x1−x1−x1+xn=xnx_1+\{x_1-[x_1+(x_1-x_n)]\}=x_1+x_1 -x_1-x_1+x_n=x_nx1+{x1−[x1+(x1−xn)]}=x1+x1−x1−x1+xn=xn
(实际上就是第一次是减去它们两个之间的差,那么我们减去这个差不就是加上这个差,也就得到了另一个数。)
同理我们也可以把式子里所有的 xkx_kxk 换成 x1x_1x1。
为什么要换成 x1x_1x1 呢,很显然如果还是当作 xix_ixi,xkx_kxk 来用的话,我们并不知道 xix_ixi,xkx_kxk 到底是谁 ~
而我们归为一类以后,只有一个变量 jjj ,我们只需要一次 for
循环即可。
最终得:
∑j(xj−x1)=K−x1\sum_{j}(x_j-x_1)=K-x_1j∑(xj−x1)=K−x1
我们可以设 aia_iai 表示 xi−x1x_i-x_1xi−x1,yiy_iyi 表示方程的未知数
这样就可以把上述方程转化为一个好看的丢番图方程(线性方程):
a1y1+a2y2+a3y3+⋯+anyn=K−x1a_1y_1+a_2y_2+a_3y_3+\cdots+a_ny_n=K-x_1a1y1+a2y2+a3y3+⋯+anyn=K−x1
实际意义就是我们选 y1y_1y1 个a1a_1a1(a1=x1−x1a_1=x_1-x_1a1=x1−x1),y2y_2y2 个 a2a_2a2(a2=x2−x1a_2=x_2-x_1a2=x2−x1),⋯\cdots⋯,凑成 K−x1K-x_1K−x1。(yiy_iyi 可以为 000 嘛)
我们只需要判断这个丢番图方程有解即可。若该方程有解,则说明最开始的式子 xi+∑j,k(xj−xk)=Kx_i+\sum_{j,k}(x_j-x_k)=Kxi+∑j,k(xj−xk)=K 有解(我们全程所有的式子的含义都没有变化,只是形式上的改变),说明 KKK 可以被通过题中所给的操作凑出来,也就是可以写到黑板上,也就是输出 YES
。
判断丢番图方程有解,很容易想到裴蜀定理:
设 a,ba,ba,b 是不全为零的整数,则存在整数x,yx,yx,y,使得ax+by=gcd(a,b)ax+by = \gcd(a,b)ax+by=gcd(a,b)。 若mmm 是 gcd(x,y)\gcd(x,y)gcd(x,y) 的倍数,方程同样有解(很显然,因为我们只需要两边同时乘上倍数即可。)
那么对于多个变量同样适用:
即:若 K−x1K-x_1K−x1 是 gcd(x1−x1=0,x2−x1,x3−x1,⋯,xn−x1)\gcd(x_1-x_1=0,x_2-x_1,x_3-x_1,\cdots,x_n-x1)gcd(x1−x1=0,x2−x1,x3−x1,⋯,xn−x1) 的倍数,则该丢番图方程有解,即 KKK 一定能够被凑出来写到黑板上,输出 YES
。
Code
非常简单的代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <unordered_map>using namespace std;
typedef long long ll;
typedef int itn;
const int N = 5e5 + 7, mod = 1e9 + 7;
const ll INF = 1e18 + 7;ll x[N], n, m, t, k;int main()
{scanf("%lld", &t);while(t -- ) {scanf("%lld%lld", &n, &k);for(int i = 1; i <= n; ++ i)scanf("%lld", &x[i]);ll gcd = 0;for(int i = 1; i <= n; ++ i)gcd = __gcd(x[i] - x[1], gcd);if((k - x[1]) % gcd == 0)puts("YES");else puts("NO");}return 0;
}
看懂了叭 ~ 超级清晰有没有 (●ˇ∀ˇ●) 我真棒(
懂了就点个赞呗
Codeforces Round #698 (Div. 2) D. Nezzar and Board(一步步推出来,超级清晰,不猜结论,看不懂来打我 ~ 好题 )相关推荐
- Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...
- Codeforces Round #699 (Div. 2) E.Sorting Books(贪心+DP / 线段树)超高质量题解,看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 E - Sorting Books 一排书架上有 nnn 本书排成一排,每本书上有一个颜色 aia_i ...
- Codeforces Round #698 (Div. 2)(A ~ F)6题全,超高质量题解)【每日亿题】2021/2/4
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 [每日亿题]Codeforces Round #698 (Div. 2)(A ~ F)6题全,超 ...
- Codeforces Round #698 (Div. 2) A-E解题报告与解法证明
Codeforces Round #698 (Div. 2) A-E解题报告与解法证明 题目解法总体概括 A Nezzar and Colorful Balls #include <bits/s ...
- Codeforces Round #698 (Div. 2) (思维)
A. Nezzar and Colorful Balls 题意:给你一个非递减序列的球,现在要给每个球涂色,要求每种颜色的球的值是单调递增的,问最少用多少种颜色 解题思路:根据题意,我们不难看出相同权 ...
- Codeforces Round #698 (Div. 2)
B题 题意:定义一个牛逼的数是这个数十进制中至少包含一个数d. 现在给定d和若干询问,每个询问一个x,问x能否分解成若干d构成的牛逼的数之和. 看起来挺难搞的,不能快速的判断是否是牛逼的数而且也不能很 ...
- codeforces Round #645 (Div. 2)D题解
Codeforces Round #645 (Div. 2)--D题解 作为一名菜鸡,理所当然得没有A出来,这道题数据放小就一水题了,可惜数据这块卡的死死的. 本题最重要的一点就是你要推出来一个结论: ...
- Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...
- Codeforces Round #563 (Div. 2)/CF1174
Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...
最新文章
- 学院-读书:影响世界的100本书
- CANOpen紧急报文
- 测试工程师python面试常问问题_面试测试工程师一般会问些什么?
- 东华大学java期末_东华大学数据结构期末复习题!.doc
- 百度App网络深度优化系列(一):DNS优化
- svn 同步 linux,linux SVN 中 配置钩子 实现 线上项目同步
- Linux/Android——input_handler之evdev (四) 【转】
- python有关urllib,urllib2和requests应用记录
- c语言知识竞赛题库答案,2021年9月全国计算机二级C语言考试真题及答案
- java带界面的代码_求一个java swing带界面的万年历代码
- 2021年最值得学习的5款开源Java框架
- 数学建模——论文排版
- c语言程序设计模拟卷视频,《C语言程序设计》模拟试卷A卷.doc
- 真正拖垮打工人的,是沉没成本
- 4.2 分类效果的评价
- Linux(CentOS7)搭建LAMP服务环境
- FastStone Capture安装包正版激活码使用说明
- 都整理好了,总有一个你用得上
- N行M列每个位置放Aij个1厘米的正方体,求表面积
- Android Studio 介绍
热门文章
- 目标检测中的Tricks
- Opencv实现透视形变
- 收藏 | 各种 Optimizer 梯度下降优化算法回顾和总结
- 16、设计模式-行为型模式-命令模式
- pt-tools系统:pt-kill 实战
- 巨大的需求之下 人工智能如何更快落地?
- 《Typecript 入门教程》 2、访问控制符:public、private、protected、readonly
- git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)....
- Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
- CSS样式中伪类和伪类元素的区别(css中一个冒号和两个冒号的区别)