标签:__ 10 gcd .. 构造 CF1477 print import
CF1477(gcd,构造)
题意
给出一个序列 \(a\),可以用它们按如下规则无限生成数字。
- 从 \(a\) 中选择一对数 \(x,y\) 。
- 将 \(2x- y\) 加入序列。
现在给出目标 \(k\) 。问能否有原来序列生成。
题意
如果我们注意到 \(2x-y = x+(x-y)\) 。
我们设 \(d = (x-y)\) 。
如果我们以 \(x_1\) 为起点构造,可以发现 \(k = \sum d*p+x_1\) 的形式,\(p\) 是任意整数。此时可以在 \(O(n^2)\) 时间判断。
又注意到 \(x_1-x_2+x_3-x_1 = x_3-x_2\) 也就是说其他起点构成的 \(d\) 可以用这样的方法构造,假定 \(x_1=0\) 就仅需判断 \(k = \sum d*p\) 是否成立,又因为 \(gcd(x_{1,2,3..,n})|x-y\) 。因此 \(gcd(x_{1,2,3..,n})|k\) 。判断这个即可。
如果 \(x_1 > 0\) 。序列整体减去 \(x_1\) 之后判断等价问题 \(gcd(x_{1,2,3..,n})|(k-x_1)\) 即可。
import sys
from collections import defaultdict, deque,Counter
import heapq
input = sys.stdin.readline
from math import *
def mrd(): return [int(x) for x in input().split()]
def rd(): return int(input())
MAXN = 2 * 10**5 + 5
INF = 10**16 * 2
mod = 10**9 + 7
#----------------------------------------------------------------------------------#
def solve():
n,k = mrd()
a = mrd()
g = 0
for i in range(n): g = gcd(a[i] - a[0],g)
print(g)
if (k - a[0]) % g == 0:
print("YES")
else:
print("NO")
if __name__ == "__main__":
for _ in range(rd()):
solve()
标签:__,10,gcd,..,构造,CF1477,print,import 来源: https://www.cnblogs.com/Mxrush/p/16459394.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。