整理的算法模板合集: 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_1a1​y1​+a2​y2​+a3​y3​+⋯+an​yn​=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(一步步推出来,超级清晰,不猜结论,看不懂来打我 ~ 好题 )相关推荐

  1. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  2. Codeforces Round #699 (Div. 2) E.Sorting Books(贪心+DP / 线段树)超高质量题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 E - Sorting Books 一排书架上有 nnn 本书排成一排,每本书上有一个颜色 aia_i ...

  3. Codeforces Round #698 (Div. 2)(A ~ F)6题全,超高质量题解)【每日亿题】2021/2/4

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 [每日亿题]Codeforces Round #698 (Div. 2)(A ~ F)6题全,超 ...

  4. Codeforces Round #698 (Div. 2) A-E解题报告与解法证明

    Codeforces Round #698 (Div. 2) A-E解题报告与解法证明 题目解法总体概括 A Nezzar and Colorful Balls #include <bits/s ...

  5. Codeforces Round #698 (Div. 2) (思维)

    A. Nezzar and Colorful Balls 题意:给你一个非递减序列的球,现在要给每个球涂色,要求每种颜色的球的值是单调递增的,问最少用多少种颜色 解题思路:根据题意,我们不难看出相同权 ...

  6. Codeforces Round #698 (Div. 2)

    B题 题意:定义一个牛逼的数是这个数十进制中至少包含一个数d. 现在给定d和若干询问,每个询问一个x,问x能否分解成若干d构成的牛逼的数之和. 看起来挺难搞的,不能快速的判断是否是牛逼的数而且也不能很 ...

  7. codeforces Round #645 (Div. 2)D题解

    Codeforces Round #645 (Div. 2)--D题解 作为一名菜鸡,理所当然得没有A出来,这道题数据放小就一水题了,可惜数据这块卡的死死的. 本题最重要的一点就是你要推出来一个结论: ...

  8. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  9. 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 ...

最新文章

  1. 学院-读书:影响世界的100本书
  2. CANOpen紧急报文
  3. 测试工程师python面试常问问题_面试测试工程师一般会问些什么?
  4. 东华大学java期末_东华大学数据结构期末复习题!.doc
  5. 百度App网络深度优化系列(一):DNS优化
  6. svn 同步 linux,linux SVN 中 配置钩子 实现 线上项目同步
  7. Linux/Android——input_handler之evdev (四) 【转】
  8. python有关urllib,urllib2和requests应用记录
  9. c语言知识竞赛题库答案,2021年9月全国计算机二级C语言考试真题及答案
  10. java带界面的代码_求一个java swing带界面的万年历代码
  11. 2021年最值得学习的5款开源Java框架
  12. 数学建模——论文排版
  13. c语言程序设计模拟卷视频,《C语言程序设计》模拟试卷A卷.doc
  14. 真正拖垮打工人的,是沉没成本
  15. 4.2 分类效果的评价
  16. Linux(CentOS7)搭建LAMP服务环境
  17. FastStone Capture安装包正版激活码使用说明
  18. 都整理好了,总有一个你用得上
  19. N行M列每个位置放Aij个1厘米的正方体,求表面积
  20. Android Studio 介绍

热门文章

  1. 目标检测中的Tricks
  2. Opencv实现透视形变
  3. 收藏 | 各种 Optimizer 梯度下降优化算法回顾和总结
  4. 16、设计模式-行为型模式-命令模式
  5. pt-tools系统:pt-kill 实战
  6. 巨大的需求之下 人工智能如何更快落地?
  7. 《Typecript 入门教程》 2、访问控制符:public、private、protected、readonly
  8. git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)....
  9. Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
  10. CSS样式中伪类和伪类元素的区别(css中一个冒号和两个冒号的区别)