[CF986F]Oppa Funcan Style Remastered[exgcd+同余最短路]
题意
给你 \(n\) 和 \(k\) ,问能否用 \(k\) 的所有 \(>1\) 的因子凑出 \(n\) 。多组数据,但保证不同的 \(k\) 不超过 50 个。
\(n\leq 10^{18}, k\leq 10^{15}\)
分析
- 记 \(k\) 的质因子数量为 \(m\) 。
如果 \(k=1\) 一定不行。
如果 \(m=1\) 直接判断是否可以整除。
如果 \(m=2\) 就是求 \(ax+by=n\) 是否存在非负整数解。
根据 \(ax \equiv n\ (mod\ b)\) 可以得到 \(x\equiv na^{(-1)}\ (mod\ b)\)
只需要判断最小的 \(x*a\) 是否 \(\le n\) 即可。
如果 \(m\ge 3\) 一定存在一个最小质因子 \(\le 10^5\) ,此时就可以套用同余最短路来求解了。
具体地,我们将最小质因子单独拿出来,答案可以写成 \(n\%p+kp\) 的形式,当且仅当 \(n\%p\) 可以用其他质因子凑出,且他们的和 \(\le n\) 时才能凑出 \(n\) 。利用最短路求解这种转移成环的问题。
- 主要复杂度在处理质因子,可以记录 \(5\times 10^7\) 以内的质因子加快枚举。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define go(u) for(int i = head[u], v = e[i].to; i; i=e[i].lst, v=e[i].to)
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define pb push_back
#define re(x) memset(x, 0, sizeof x)
inline int gi() {
int x = 0,f = 1;
char ch = getchar();
while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar();}
while(isdigit(ch)) { x = (x << 3) + (x << 1) + ch - 48; ch = getchar();}
return x * f;
}
template <typename T> inline void Max(T &a, T b){if(a < b) a = b;}
template <typename T> inline void Min(T &a, T b){if(a > b) a = b;}
const int N = 1e5 + 7;
const LL inf = 1e18 + 7;
int T, qc;
bool vis[N], ans[N];
LL dis[N];
struct qs {
LL n, k; int id;
bool operator <(const qs &rhs) const {
return k < rhs.k;
}
}q[N];
struct data {
int u;LL dis;
bool operator <(const data &rhs) const {
return rhs.dis < dis;
}
};
priority_queue<data>Q;
vector<LL> pf;
void dijk(int n) {
for(int i = 0; i < n; ++i) dis[i] = inf;
memset(vis, 0, sizeof vis);
dis[0] = 0;Q.push((data){ 0, 0});
while(!Q.empty()) {
int u = Q.top().u;Q.pop();
if(vis[u]) continue;vis[u] = 1;
for(int i = 1; i < pf.size(); ++i) {
int v = (u + pf[i]) % n;
if(dis[u] + pf[i] >= 0 && dis[u] + pf[i] < dis[v]) {
dis[v] = dis[u] + pf[i];
Q.push((data){ v, dis[v]});
}
}
}
}
void exgcd(LL a, LL b, LL &x, LL &y) {
if(!b) { x = 1, y = 0; return;}
exgcd(b, a % b, y, x); y -= x * (a / b);
}
const int num_sz = 5e7 + 7;
int t, pc;
int pri[num_sz];
bool visp[num_sz];
void pre(int n) {
int to;
for(int i = 2; i <= n; ++i) {
if(!visp[i]) pri[++pc] = i;
for(int j = 1; (to = i * pri[j]) <= n; ++j) {
visp[to] = 1;
if(i % pri[j] == 0) break;
}
}
}
int main() {
pre(5e7);
T = gi();
rep(i, 1, T) {
LL a, b;
scanf("%lld%lld", &a, &b);
q[++qc] = (qs){ a, b, i};
}
sort(q + 1, q + 1 + qc);
int cnt = 0;
for(int i = 1, j = 1; i <= T; i = j + 1, j = i) {
pf.clear();
while(j + 1 <= T && q[j + 1].k == q[j].k) ++j;
LL x = q[i].k;
for(int k = 1, l = (int)sqrt(x); k <= pc && pri[k] <= l; ++k) if(x % pri[k] == 0){
while(x % pri[k] == 0) x /= pri[k];
pf.pb(pri[k]);
}
if(x > 1) pf.pb(x);
if(pf.empty()) continue;
if(pf.size() == 1) {
for(int k = i; k <= j; ++k)
ans[q[k].id] = q[k].n % q[k].k == 0;
continue;
}
if(pf.size() == 2) {
LL x, y, inva;
exgcd(pf[0], pf[1], x, y);
inva = (x + pf[1]) % pf[1];
for(int k = i; k <= j; ++k)
ans[q[k].id] =pf[0] * (q[k].n % pf[1] * inva % pf[1]) <= q[k].n;
continue;
}
sort(pf.begin(), pf.end());
dijk(pf[0]);
for(int k = i; k <= j; ++k)
ans[q[k].id] = dis[q[k].n % pf[0]] <= q[k].n;
}
for(int i = 1; i <= T; ++i) puts(ans[i] ? "YES": "NO");
return 0;
}
[CF986F]Oppa Funcan Style Remastered[exgcd+同余最短路]的更多相关文章
- Codeforces 986F - Oppa Funcan Style Remastered(同余最短路)
Codeforces 题面传送门 & 洛谷题面传送门 感谢此题教会我一个东西叫做同余最短路(大雾 首先这个不同 \(k\) 的个数 \(\le 50\) 这个条件显然是让我们对每个 \(k\) ...
- CF986F Oppa Funcan Style Remastered
CF986F Oppa Funcan Style Remastered 不错的图论转化题! 题目首先转化成:能否用若干个k的非1因数的和=n 其次,因数太多,由于只是可行性,不妨直接都用质因子来填充! ...
- codeforces986F Oppa Funcan Style Remastered【线性筛+最短路】
容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2<=n则有解,否则无解 然后剩下的情况最 ...
- 「CF986F」 Oppa Funcan Style Remastered
「CF986F」 Oppa Funcan Style Remastered Link 首先发现分解成若干个 \(k\) 的因数很蠢,事实上每个因数都是由某个质因子的若干倍组成的,所以可以将问题转换为分 ...
- [Codeforces 485F] Oppa Funcan Style Remastered
[题目链接] https://codeforces.com/contest/986/problem/F [算法] 不难发现 , 每个人都在且仅在一个简单环中 , 设这些环长的长度分别为 A1, A2 ...
- Codeforces 516E - Drazil and His Happy Friends(同余最短路)
Codeforces 题面传送门 & 洛谷题面传送门 首先思考一个非常简单的性质:记 \(d=\gcd(n,m)\),那么每次在一起吃完饭的男女孩编号必定与 \(d\) 同余,而根据斐蜀定理可 ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- HDU 6071 Lazy Running (同余最短路 dij)
Lazy Running Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)To ...
- BZOJ 2118 墨墨的等式 (同余最短路)
题目大意:已知B的范围,求a1x1+a2x2+...+anxn==B存在非负正整数解的B的数量,N<=12,ai<=1e5,B<=1e12 同余最短路裸题 思想大概是这样的,我们选定 ...
随机推荐
- Azure 中 Windows 虚拟机的大小
本文介绍可用于运行 Windows 应用和工作负荷的 Azure 虚拟机的可用大小和选项. 此外,还提供在计划使用这些资源时要考虑的部署注意事项. 本文也适用于 Linux 虚拟机. 类型 大小 说明 ...
- Web Api跨域访问配置及调用示例
1.Web Api跨域访问配置. 在Web.config中的system.webServer内添加以下代码: <httpProtocol> <customHeaders> &l ...
- 阿里八八Alpha阶段Scrum(9/12)
今日进度 叶文滔: 成功完成多级悬浮按钮,并添加与日程输入界面的连接.debug了一些对接产生的问题 黄梅玲: 合并单日项目至多日.获取json数据 王国超: 完成了初步的多日界面,pull至项目.进 ...
- Alpha冲刺报告(5/12)(麻瓜制造者)
今日已完成 明日计划 部分api示意图 燃尽图 scrum会议照片 今日已完成 邓弘立: 完成部分首页逻辑功能 符天愉: 写代码写着写着想起来昨天的登录接口有个非常zz的逻辑错误,今天修改完后应该没有 ...
- 【PyCharm疑问】在pycharm中带有中文时,有时会导致程序判断错误,是何原因?
1.会导致程序打印false错误的代码如下: # -*- coding:utf-8 -*- import os import sys from uiautomator import device as ...
- postgresql----几何类型和函数
postgresql支持的几何类型如下表: 名字 存储空间 描述 表现形式 point 16字节 平面上的点 (x,y) line 32字节 直线 {A,B,C} lseg 32字节 线段 ((x1, ...
- nowcoder练习赛28
https://www.nowcoder.com/acm/contest/200#question 最近突然找到了打比赛的乐趣,于是参加了这场比赛. 生日宴会:https://www.nowcoder ...
- RMAN 备份数据库到DISK后进行数据恢复
RMAN 备份数据库到DISK,然后进行数据恢复 一.rman备份 1. 全备脚本 vi bakup_level0.sql connect target / run { allocate channe ...
- [POI2011]Meteors
嘟嘟嘟 做了几道题之后,对整体二分有点感觉了. 整体二分的本质就是二分答案.所以这道题二分的就是次数. 然后就是套路了,把小于\(mid\)的操作都添加减去,然后查询,如果查询的值\(x\)比给定值大 ...
- PHP(Mysql/Redis)消息队列的介绍及应用场景案例--转载
郑重提示:本博客转载自好友博客,个人觉得写的很牛逼所以未经同意强行转载,原博客连接 http://www.cnblogs.com/wt645631686/p/8243438.html 欢迎访问 在进行 ...