Codeforces 986F - Oppa Funcan Style Remastered(同余最短路)
感谢此题教会我一个东西叫做同余最短路(大雾
首先这个不同 \(k\) 的个数 \(\le 50\) 这个条件显然是让我们对每个 \(k\) 进行一遍预处理并快速求出答案。怎么预处理呢?首先考虑一个非常 trivial 的性质,那就是所有 \(k\) 的非质数因子显然可以表示成质因子的和对吧,所以一个数能够表示成 \(k\) 的若干个质因子的和,当且仅当它能够表示成 \(k\) 的若干个质因子的和。因此考虑先对 \(k\) 进行一遍质因数分解——可以使用 PR 算法,但是我不会,每次 \(\sqrt{k}\) 地分解会超时,这里有一个简单的技巧,之前暑假某场模拟赛出现过,就是显然我们只会用到 \(\le\sqrt{k}\) 的所有质因子,因此可以考虑预处理出 \(\le \sqrt{10^{15}}\) 的所有质数,然后每次分解遍历一遍这个质数集合即可,这样分解的复杂度可以降到 \(\sqrt{10^{15}}·\dfrac{1}{\ln 10^{15}}·50\)。
考虑怎样计算答案,如果 \(k\) 本身就是质数那显然只有 \(k\) 的倍数能够表示成 \(k\) 的 \(\ne 1\) 的质因子之和。直接判断一下 \(n\bmod k=0\) 是否成立即可。如果 \(k\) 有两个质因子,那么假设 \(k\) 两个质因子分别为 \(x,y\),那么我们需检验是否 \(\exists a,b\in[0,\infty)\cap\mathbb{Z},s.t.ax+by=n\),显然必须有 \(by\equiv n\pmod{x}\),那么 \(b\) 的最小值 \(b_{\min}=n·y^{-1}\bmod x\),检验一下是否有 \(b_{\min}·y\le n\) 即可。
如果 \(k\) 质因子个数 \(\ge 3\),那么假设 \(k\) 的质因子分别为 \(p_1,p_2,\cdots,p_m\),那么我们需检验是否 \(\exists x_1,x_2,\cdots,x_m\in[0,\infty)\cap\mathbb{Z},s.t.\sum\limits_{i=1}^mp_ix_i=n\),直接检验貌似有点棘手,不过不难发现有一个性质,那就是对于任意 \(x_i\) 及 \(n\),如果 \(n\) 可行,那么 \(n+zp_i\) 也可行,也就是说对于所有 \(j\in[0,p_i)\),必然存在一个界 \(lim_j\),满足所有 \(\bmod x_i=j\) 的数当中,所有 \(\ge lim_j\) 的数都符合要求,所有 \(<lim_j\) 的数都符合要求,考虑怎样求 \(lim_j\),显然 \(lim_0=0\),而对于所有 \(j\in[0,x_i),t\in[1,m]\),显然 \(lim_{(j+p_t)\bmod p_1}\le lim_j+p_t\),这是一个最短路的形式,用 dijkstra 转移即可。并且不难发现对于 \(k\le 10^{15}\),这种情况下 \(k\) 最小的质因子必然 \(\le 10^5\),因此我们对 \(k\) 最小质因子跑同余最短路即可实现 \(10^5\log 10^5·50\) 的复杂度。
话说这场的 D、E,尤其是那个恶心无比的 D……勾起了远古回忆
const int MAXN=1e4;
const int MAXK=1e5;
const int MAXV=3.163e7;
int qpow(int x,int e,int mod){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%mod) if(e&1) ret=1ll*ret*x%mod;
return ret;
}
int qu,pr[MAXV/8+5],prcnt,vis[MAXV+5];
void sieve(int n){
for(int i=2;i<=n;i++){
if(!vis[i]) pr[++prcnt]=i;
for(int j=1;j<=prcnt&&pr[j]*i<=n;j++){
vis[pr[j]*i]=1;if(i%pr[j]==0) break;
}
}
}
int res[MAXN+5];
map<ll,vector<pair<ll,int> > > mpv;
vector<ll> decomp(ll v){
vector<ll> ret;
for(int i=1;i<=prcnt;i++) if(v%pr[i]==0){
ret.pb(pr[i]);
while(v%pr[i]==0) v/=pr[i];
} if(v>1) ret.pb(v);
return ret;
}
ll dis[MAXK+5];
int main(){
sieve(MAXV);scanf("%d",&qu);
for(int i=1;i<=qu;i++){
ll n,k;scanf("%lld%lld",&n,&k);
if(k!=1) mpv[k].pb(mp(n,i));
}
for(auto it:mpv){
ll v=it.fi;vector<pair<ll,int> > qv=it.se;
vector<ll> pr=decomp(v);
if(pr.size()==1){
for(pair<ll,int> p:qv) res[p.se]=(p.fi%pr[0]==0);
} else if(pr.size()==2){
ll x=pr[0],y=pr[1],ivy=qpow(y%x,x-2,x);
for(pair<ll,int> p:qv){
int bmin=1ll*(p.fi%x)*ivy%x;
res[p.se]=(p.fi>=1ll*bmin*y);
}
} else {
int x=pr[0];memset(dis,63,sizeof(dis));dis[0]=0;
priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > > q;
q.push(mp(0,0));
while(!q.empty()){
pair<ll,int> p=q.top();q.pop();
int cur=p.se;
for(int i=1;i<pr.size();i++){
if(dis[(cur+pr[i])%x]>dis[cur]+pr[i]){
dis[(cur+pr[i])%x]=dis[cur]+pr[i];
q.push(mp(dis[(cur+pr[i])%x],(cur+pr[i])%x));
}
}
}
for(pair<ll,int> p:qv) res[p.se]=(p.fi>=dis[p.fi%x]);
}
}
for(int i=1;i<=qu;i++) printf("%s\n",(res[i])?"YES":"NO");
return 0;
}
Codeforces 986F - Oppa Funcan Style Remastered(同余最短路)的更多相关文章
- [Codeforces 485F] Oppa Funcan Style Remastered
[题目链接] https://codeforces.com/contest/986/problem/F [算法] 不难发现 , 每个人都在且仅在一个简单环中 , 设这些环长的长度分别为 A1, A2 ...
- CF986F Oppa Funcan Style Remastered
CF986F Oppa Funcan Style Remastered 不错的图论转化题! 题目首先转化成:能否用若干个k的非1因数的和=n 其次,因数太多,由于只是可行性,不妨直接都用质因子来填充! ...
- 「CF986F」 Oppa Funcan Style Remastered
「CF986F」 Oppa Funcan Style Remastered Link 首先发现分解成若干个 \(k\) 的因数很蠢,事实上每个因数都是由某个质因子的若干倍组成的,所以可以将问题转换为分 ...
- [CF986F]Oppa Funcan Style Remastered[exgcd+同余最短路]
题意 给你 \(n\) 和 \(k\) ,问能否用 \(k\) 的所有 \(>1\) 的因子凑出 \(n\) .多组数据,但保证不同的 \(k\) 不超过 50 个. \(n\leq 10^{1 ...
- codeforces986F Oppa Funcan Style Remastered【线性筛+最短路】
容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2<=n则有解,否则无解 然后剩下的情况最 ...
- 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 同余最短路裸题 思想大概是这样的,我们选定 ...
随机推荐
- 图解Redis6中的9种数据结构,墙裂建议准备去面试的人先看(干货,建议收藏)
如图所示,Redis中提供了9种不同的数据操作类型,他们分别代表了不同的数据存储结构. 图2-17 数据类型 String类型 String类型是Redis用的较多的一个基本类型,也是最简单的一种类型 ...
- F1西班牙大奖赛-加泰罗尼亚赛道地图及简介
背景 银石双赛结束,第二轮三连赛的最后一场将转战西班牙,第50届F1西班牙大奖赛将于本周末(正赛2020-08-15)在加泰罗尼亚赛道上演. 作为近年来F1承办季前测试的赛道,所有人都对这里再熟悉不过 ...
- 【c++ Prime 学习笔记】第8章 IO库
C++语言不直接处理输入输出,而是通过标准库中的一组类来处理IO 1.2节介绍的IO库: istream(输入流)类型,提供输入 ostream(输出流)类型,提供输出 cin,是istream对象, ...
- Alpha项目展示
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 Alpha-项目展示 我们是谁 删库跑路对不队 我们在做什么 题士 进度如何 进度总览 一.项目与团队亮点 ...
- 带你用AVPlayer实现音频和视频播放
项目概述 以下项目是基于AVPlayer的实际运用,实现音频播放.横竖屏视频切换播放.类似抖音的竖屏全屏播放效果. 项目地址:AVPlayerAudioVideo 如果文章和项目对你有帮助,还请给个S ...
- 用cmd命令行创建vue项目模板
1.进入cmd命令行 输入存放项目的位置 2.通过vue create 项目名称 创建项目 3.选择Manually select features 4.通过空格选中第1.2.5.6.7.去掉8 4. ...
- C语言基础知识总结大全
1.入门程序 #include <stdio.h> int main() { printf("Hello World!"); return 0; } 2.数据类型 数据 ...
- 洛谷 P2680 [NOIP2015 提高组] 运输计划
链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...
- Vue:Vue的介绍以及组件剖析
介绍 现在,随着基于JavaScript的单页应用程序(SPA)和服务器端渲染(SSR)的兴起,可以用JavaScript编写整个前端应用程序,并整洁地管理和维护该应用程序的前端代码.诸如Angula ...
- Java不同时区(timezone)之间时间转换
最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间. 一.关于时区的一些概 ...