CF338D GCD Table(拓展中国剩余定理,细节处理,2900分)
整理的算法模板合集: ACM模板
点我看算法全家桶系列!!!
实际上是一个全新的精炼模板整合计划
CF338D GCD Table(拓展中国剩余定理,细节处理,2900分)
Problem
有一张 n×mn\times mn×m 的表格 GGG,第 iii 行第 jjj 列的元素是 G(i,j)=gcd(i,j)G(i,j)=\gcd(i,j)G(i,j)=gcd(i,j) 。给定一个长度为 kkk 的序列 aia_iai ,询问是否存在 x,yx,yx,y,满足 ∀i,1≤i≤k,G(x,y+i−1)=gcd(x,y+i−1)=ai\forall i,1\le i\le k,G(x,y+i-1)=\gcd(x,y+i-1)=a_i∀i,1≤i≤k,G(x,y+i−1)=gcd(x,y+i−1)=ai (即问是否有在表格范围内的解 (x,y)(x,y)(x,y) )。
数据范围:1≤n,m≤1012,1≤k≤104,1≤ai≤10121\le n,m\le 10^{12},1\le k\le 10^4,1\le a_i\le 10^{12}1≤n,m≤1012,1≤k≤104,1≤ai≤1012
Solution
根据题意显然可以列出:
{gcd(x,y+1−1)=a1gcd(x,y+2−1)=a2⋯gcd(x,y+k−1)=ak\left\{ \begin{aligned} \gcd(x,y+1-1) & = & a_1 \\ \gcd(x,y+2-1) & = & a_2 \\ \cdots\\ \gcd(x,y+k-1)& = & a_k \end{aligned} \right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧gcd(x,y+1−1)gcd(x,y+2−1)⋯gcd(x,y+k−1)===a1a2ak
我们知道 gcd(a,b)=c\gcd(a,b) =cgcd(a,b)=c,经典套路,显然有:a=k1c,b=k2c,k1∤k2a=k_1c,b=k_2c,k_1\nmid k_2a=k1c,b=k2c,k1∤k2
即:
a∣c,b∣c⇒x∣ai,y+i−1∣aia\mid c,b\mid c\Rightarrow x\mid a_i,y+i-1\mid a_i a∣c,b∣c⇒x∣ai,y+i−1∣ai
即:
x≡0modaiy≡(1−i)modai\begin{aligned}&x\equiv0 \bmod a_i&\\&y\equiv(1-i)\bmod a_i\end{aligned} x≡0modaiy≡(1−i)modai
所以我们可以列出一个同余方程组:
{y≡(1−1)moda1y≡(1−2)moda2⋯y≡(1−k)modak\left\{ \begin{aligned}&y\equiv(1-1)\bmod a_1&\\&y\equiv(1-2)\bmod a_2\\&\ \ \ \ \ \ \ \ \ \ \ \ \ \ \cdots&\\&y\equiv(1-k)\bmod a_k\end{aligned} \right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧y≡(1−1)moda1y≡(1−2)moda2 ⋯y≡(1−k)modak
显然 aia_iai 不一定是质数,所以我们直接使用拓展中国剩余定理求解即可,这样我们就可以求出一个合法的 yyy。
那么如何求出最小的(不容易越界)且合法的 xxx 呢,显然 xxx 可以整除所有的 aia_iai,那么满足条件的最小的 xxx 显然是 lcm{ai}\text{lcm}\{ a_{i} \}lcm{ai}。
求出 x,yx,yx,y 以后验证一下开头列出来的 gcd\gcdgcd 是否完全相同,以及 G(x,y+i−1)G(x,y+i-1)G(x,y+i−1) 中的 (x,y+i−1)(x,y+i-1)(x,y+i−1) 是否在 GGG 函数的定义域内即可。(我们只需要判断 x,y+i−1,y+k−1x,y+i-1,y+k-1x,y+i−1,y+k−1 是否越界即可)
Hint
这里如果给定的模数均为 111 的话,直接用
excrt
板子求出来的是 000 ,此时应该是答案取任意值均可,但是这里如果答案取 000 的话 y<1y<1y<1 会判负,实际上是有解的,所以这里要特判一下。龟速乘的时候,如果乘的是负数的话需要 a,ba,ba,b 同时取反,否则会死循环hhh
Code
// Problem: D. GCD Table
// Contest: Codeforces - Codeforces Round #196 (Div. 1)
// URL: https://codeforces.com/problemset/problem/338/D
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
#define int long long
using namespace std;
using ll = long long;
const int N = 1e4 + 7;int n, m, k, t;
int a[N], LCM;
int ai[N], bi[N];template <typename T> inline void read(T& t) {int f = 0, c = getchar(); t = 0; while (!isdigit(c)) f |= c == '-', c = getchar();while (isdigit(c)) t = t * 10 + c - 48, c = getchar();if (f) t = -t;
}template <typename T> void print(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) print(x / 10);putchar(x % 10 + 48);
} int gcd(int a, int b)
{if(b == 0) return a;return gcd(b, a % b);
}int lcm(int a, int b)
{return a / gcd(a, b) * b;
}int exgcd(int a, int b, int &x, int &y)
{if(b == 0) {x = 1, y = 0;return a;}int d = exgcd(b, a % b, x, y);int z = x;x = y, y = z - a / b * y; return d;
}int mul(int a, int b, int c)
{if(b < 0) a = - a, b = - b;int res = 0;while(b) {if(b & 1) res = (res + a) % c;a = (a + a) % c;b >>= 1;}return res;
}ll excrt(int n)
{ll x, y, k;ll M = bi[1], ans = ai[1];for(int i = 2; i <= n; ++ i) {ll a = M, b = bi[i], c = (ai[i] - ans % b + b) % b;ll d = exgcd(a, b, x, y);ll bg = b / d;if(c % d != 0) return -1;x = mul(x, c / d, bg);ans += x * M;M *= bg;ans = (ans % M + M) % M;} ans = (ans % M + M) % M;if(ans == 0) ans = M;//ans = 1;return ans;
}signed main()
{LCM = 1;read(n), read(m), read(k);for(int i = 1; i <= k; ++ i) {read(a[i]);LCM = lcm(LCM, a[i]);}if(k > m) return puts("NO"), 0;for(int i = 1; i <= k; ++ i) {bi[i] = a[i];ai[i] = (1 - i + a[i]) % a[i];}int x = LCM, y = excrt(k); if(y == -1) return puts("NO"), 0;for(int i = 1; i <= k; ++ i) {if(gcd(x, y + i - 1) != a[i]) return puts("NO"), 0;} if(y < 1 || x < 1 || y + k - 1 > m || x > n) return puts("NO"), 0;return puts("YES"), 0;
}
CF338D GCD Table(拓展中国剩余定理,细节处理,2900分)相关推荐
- 中国剩余定理学习 拓展中国剩余定理
中国剩余定理学习 && 拓展中国剩余定理 中国剩余定理: 拓展中国剩余定理: 中国剩余定理: 仅供自己复习时查看一下大佬笔记,详细学习过程在大佬的博客. 学习连接:https://ww ...
- ACM数论----中国剩余定理与拓展中国剩余定理
一.问题引入: 在<孙子算经>中有这样一个问题:"今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?"这个问 ...
- 中国剩余定理拓展中国剩余定理
复习 中国剩余定理: x ≡ a 1 ( m o d m 1 ) x ≡a_1(mod m_1) x≡a1(modm1) x ≡ a 2 ( m o d m 2 ) x ≡a_2(mod m_2) ...
- 【原创】 中国剩余定理 和 拓展中国剩余定理
孙子 Preface 数论学习Part 7. 每天进步一点点,退役不会太丢脸. 联赛只剩十五天,隔靴搔痒智何添? 剩余定理四天一篇,动归图论又几何,数据结构似云烟. 莫再等闲,莫忘时间. CRT 我们 ...
- 数学:拓展中国剩余定理
拓展中国剩余定理解决模数不互质同余方程组 如果模数互质的话,直接中国剩余定理就可以了 但是如果模数不互质又没有接触这个方法就凉凉了 推是很不好推出来的 假设我们这里有两个方程: x=a1∗x1+b1 ...
- [数论]拓展中国剩余定理
拓展中国剩余定理 •拓展中国剩余定理 拓展中国剩余定理是用来解同余方程 $\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c ...
- poj 1006 java_POJ 1006 Java:中国剩余定理
题目描述: 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏 ...
- 密码学基础算法(二)中国剩余定理
随便谷歌了一个图片做首图 原图地址: http://www.siwapu.com/etagid41968b0/ 密码学基础系列: (一) 基于整数的欧几里得算法和扩展欧几里得算法 (二) 中国剩余定理 ...
- 与数论的厮守04:扩展中国剩余定理
根据数论的尿性,一般的定理解决不了的问题怎么办?那就拓展一下呗. 我们先看中国剩余定理,它解决的是一堆同余方程:nΞa1(mod b1),nΞa2(mod b2)...nΞak(mod bk),其中b ...
最新文章
- 【python】组合搜索
- hystrix 单独使用_使用Hystrix对Dubbo消费者提供线程隔离保护
- 三星s9php禁用列表,ADB禁用列表
- MySQL 基本信息的查询(初始化配置信息 my.ini)
- 员工离职困扰?来看AI如何解决,基于人力资源分析的 ML 模型构建全方案 ⛵
- wilcoxon符号秩检验matlab,符号检验和wilcoxon符号秩检验的区别
- JDK自带javap命令反编译class文件和Jad反编译class文件(推荐使用jad)
- TongWeb卡、TongWeb卡、TongWeb卡卡卡
- pycharm报错: with exit code -1073740791 (0xC0000409)
- 使用NLTK对英文文章分句,避免缩略词标点符号干扰
- 2021年11月23日对自己的一次鼓励
- 阿里云Linux服务器部署JDK8实战教程
- docker portainer agent 安装
- VB中使用DirectX库的简明教程(3)
- 如何获取三维标签的轮廓表示
- 智能电饭煲设计(文档+仿真源文件)
- 上海房屋租赁价格数据(11月24日)
- Excel VBA高效办公应用-第十六章-VBA高效文件操作(同时给多个工作簿加解密)
- 增长黑客:如何绘制用户的旅程?
- Innodb MRR优化