首页 > 其他分享 >CF1155C 题解

CF1155C 题解

时间:2024-08-10 10:39:16浏览次数:15  
标签:题解 ll 因数 cdots CF1155C 序列 equiv 公因数

题目传送门

题目大意:

给定一个长度为 \(n\) 的单增序列 \(a\) 和一个长度为 \(m\) 的序列 \(b\),询问是否存在一个正整数 \(y\) 使得 \(a_1\equiv a_2\equiv\cdots \equiv a_n\equiv y\space (\bmod\space p)\),且 \(p\) 在序列 \(b\) 中出现过。

思路:

将条件转化一下,得:是否存在一个正整数 \(y\) 使得 \(p \mid (a_2 - a_1),p \mid (a_3 - a_2)\cdots p \mid (a_n - a_{n - 1})\),说白了就是我们要寻找的 \(p\) 是序列 \(a\) 所有相邻项之差的因数。

所以先构造一个差分序列 \(c\),然后求出 \(c\) 中所有数的最大公因数 \(d\)。

引理:

任意 \(n\) 个正整数 \((n\ge 2)\) 的所有公因数都是这 \(n\) 个数的最大公因数的因数。

证明:

先考虑两个数的情况。

设这两个数是 \(a,b\),考虑将它们分解质因数,并将质因数对齐,得:

\[a = p_{1}^{a_1}p_{2}^{a_2}\cdots p_{k}^{a_k} \]

\[b = p_{1}^{b_1}p_{2}^{b_2}\cdots p_{k}^{b_k} \]

对于 \(a,b\) 的任意因数 \(d\),我们也将它分解质因数并对齐,得:

\[d = p_{1}^{c_1}p_{2}^{c_2}\cdots p_{k}^{c_k} \]

注意!这里的 \(a_i\) 和 \(b_i\) 可能为 \(0\)!(因为只是对齐处理,可能并不含此质因子)

根据因数的定义可得:

\[c_i \le \min(a_i, b_i),i\in [1, k] \]

而对于 \(\gcd(a, b)\),此时有:

\[c_i = \min(a_i, b_i),i\in [1, k] \]

也就是取等了!

所以不难得出,\(a,b\) 所有公因数都是最大公因数的因数。

那么推广到 \(n\) 个数的情况就不难了,请读者自行证明。

其实挺显然的吧。

有了这个引理,我们就只需要找序列 \(b\) 中是否存在一个数是 \(d\) 的因数即可。

然后就是一些小细节了。

时间复杂度为 \(O(n + m + \log(\max\{c_i\}))\)。

\(\texttt{Code:}\)

#include <iostream>

using namespace std;

const int N = 300010;
typedef long long ll;
int n, m;
ll a[N], p[N], c[N];

ll gcd(ll a, ll b) {
    if(b == 0) return a;
    return gcd(b, a % b);
}

int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
    for(int i = 1; i <= m; i++) scanf("%lld", &p[i]);
    for(int i = 1; i <= n; i++) c[i] = a[i] - a[i - 1];
    ll d = c[2];
    for(int i = 3; i <= n; i++) 
        d = gcd(d, c[i]);
    bool flag = false;
    ll fac, ans;
    for(int i = 1; i <= m; i++)
        if(d % p[i] == 0) {
            puts("YES");
            flag = true;
            fac = p[i];
            ans = i;
            break;
        }
    if(!flag) {
        puts("NO");
        return 0;
    }
    if(c[1] % fac == 0) printf("%lld %lld", fac, ans);
    else printf("%lld %lld", c[1] % fac, ans);
    return 0;
}

标签:题解,ll,因数,cdots,CF1155C,序列,equiv,公因数
From: https://www.cnblogs.com/Brilliant11001/p/18352023

相关文章

  • 08-08 题解
    08-08题解地址A-CF1420Eluogu翻译更正ifhegivesnomorethatkorders对于至多k次操作,题面没有翻译出来思路怎么算贡献?贡献(被保护)出现在「处在任意两个不同的0的连续段的守卫」之间,而处于同一连续段的守卫之间没有贡献设一共\(cnt\)个\(0\),每个连续......
  • 提高组:玩具谜题 题解
    题目描述小南有一套可爱的玩具小人,它们各有不同的职业。有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:这时singer告诉小南一个谜题:“眼镜藏在我左数第 33 个玩具小人的右数第 11 个玩具小人的左数第......
  • 08-09 题解
    08-09题解A小水题思路假设我们选定了当前子序列的绝对众数\(x\),那么该序列里最多再放\(num_x-1\)个其他数字为了分出最少的子序列,肯定要让每个子序列在拥有绝对众数的同时能消化尽量多的其他数字由此,可以得到一个贪心策略:每次取出出现次数最多的一个数字,消掉出现......
  • P1725 琪露诺 题解
    思路动态规划,单调队列动态规划观察题目,发现下标为\(i\)的点只能对\([i+l,i+r]\)区间的点产生贡献。设\(f_i\)为到达点\(i\)时的最大冻结指数。易得状态转移方程式:\(f_k\leftarrow\max(f_k,f_i+a_k),(k\in[i+l,i+r])\)。若直接对该方程进行转移,时间复......
  • AT_abc208_d 题解
    题目传送门做完这道题后感觉对Floyd的理解更深了。根据题面要求,设\(f(k,i,j)\)表示从\(i\)到\(j\)的所有只经过\(1\simk\)的点的所有路径的最短距离。很明显\(k\)那一维是阶段,因为它描述了从\(i\)到\(j\)路径中的不同点,而我们就是根据这一条件来划分集合,这......
  • CF908D New Year and Arbitrary Arrangement 题解
    Description给定\(k,pa,pb\),有一初始为空的序列。每次有\(\dfrac{pa}{pa+pb}\)的概率往序列后面加一个a。每次有\(\dfrac{pb}{pa+pb}\)的概率往序列后面加一个b。当出现大于等于\(k\)个形如ab的子序列(a和b不一定相邻)时停止。求序列最终的ab子序列期望数。So......
  • 【保奖思路】2024年华为杯研究生数学建模D题解题思路分享(点个关注,后续会更新
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!点击链接加入群聊【2024华为杯研赛资料汇】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MwNruKbEvR9aZns1l7xXBWmQQKYAEh-F&authKey=igaBN79pz6BhNlDQ6TIZ5YFAbn71aDcYL77uANPquLF%2FTVgeSAhE......
  • 【保奖思路】2024年华为杯研究生数学建模D题解题思路分享(点个关注,后续会更新
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!点击链接加入群聊【2024华为杯研赛资料汇】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MwNruKbEvR9aZns1l7xXBWmQQKYAEh-F&authKey=igaBN79pz6BhNlDQ6TIZ5YFAbn71aDcYL77uANPquLF%2FTVgeSAhE......
  • CF1984G Magic Trick II 题解
    前记第一篇黑题题解。难调。好写。码量不大。Description给定一个大小为nnn的排列pp......
  • AGC001 题解
    目录A-BBQEasyB-MysteriousLightC-ShortenDiameterA-BBQEasy先将\(2N\)个数排序,从大到小考虑,最大的数一定不会产生贡献,次大的数可以和最大的数捆绑在一起,并产生贡献,以此类推,这样的贪心正确性还是较为显然的。#include<bits/stdc++.h>#definelllonglongusin......