CF986F Oppa Funcan Style Remastered
CF986F Oppa Funcan Style Remastered
不错的图论转化题!
题目首先转化成:能否用若干个k的非1因数的和=n
其次,因数太多,由于只是可行性,不妨直接都用质因子来填充!
即:是否存在ai,使得∑ai*pi=n
经典套路:同余系最短路!
最小质因子p0,n一定是若干p0和其他的数凑出来的
dis[i]表示,%p0=i的数用pi来凑出来,最小是多少。最短路即可。
如果dis[n%p0]<=n,那么一定可以!
把询问离线,按照k依次处理。
一些特殊情况:
k=1,全都是NO
k是质数,特判
k是p1,p2两个质因子,这时最短路点数可能是3e7的,会TLE,于是解不定方程:x*p1+y*p2=n是否有x,y的自然数解。注意很可能爆long long,所以x=(n/g)%(p2/g)*x%(p2/g)
k有三个以上质因子,点数最多1e5,同余系最短路。
质因数分解可以暴力分解,线性筛出根号1e15的质数,总分解复杂度<50*4000000
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
void inc(int &x,int y){x=ad(x,y);}
int mul(int x,int y){return (ll)x*y%mod;}
void inc2(int &x,int y){x=mul(x,y);}
int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
}
//using namespace Modulo;
namespace Miracle{
const int N=1e5+;
const int M=+;
int m;
struct qs{
ll n,k,id;
bool friend operator <(qs a,qs b){
return a.k<b.k;
}
}q[N];
int ans[N];
vector<ll>yin;
int pri[+],cnt;
bool vis[M];
void sieve(int n){
for(reg i=;i<=n;++i){
if(!vis[i]){
pri[++cnt]=i;
}
for(reg j=;j<=cnt;++j){
if(i*pri[j]>n) break;
vis[i*pri[j]]=;
if(i%pri[j]==) break;
}
}
}
ll dis[N];
queue<int>Q;
void spfa(int mod){
memset(dis,0x3f,sizeof dis);
// for(solid y:yin){
// // cout<<" yy "<<y<<endl;
// }
dis[]=;
Q.push();
while(!Q.empty()){
int x=Q.front();Q.pop();vis[x]=;
// cout<<"xx "<<x<<endl;
for(reg i=;i<yin.size();++i){
int y=(x+yin[i])%mod;
if(dis[y]>dis[x]+yin[i]){
dis[y]=dis[x]+yin[i];
if(!vis[y]){
vis[y]=;
Q.push(y);
}
}
}
}
}
void divi(ll K){
yin.clear();
ll tmp=K;
for(reg i=;(ll)pri[i]*pri[i]<=tmp&&i<=cnt;++i){
if(tmp%pri[i]==){
yin.pb(pri[i]);
while(tmp%pri[i]==) tmp/=pri[i];
}
}
if(tmp!=) yin.pb(tmp);
}
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=;y=;return a;
}
ll ret=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return ret;
}
int main(){
rd(m);
ll mx=;
for(reg i=;i<=m;++i){
rd(q[i].n);rd(q[i].k);q[i].id=i;
mx=max(mx,q[i].k);
}
mx=sqrt(mx);
sieve(mx);
memset(vis,,mx+);
// prt(vis,0,mx);
sort(q+,q+m+);
int typ=;
for(reg i=;i<=m;++i){
if(q[i].k!=q[i-].k){
divi(q[i].k);
typ=;
if(q[i].k==) typ=;
else if(yin.size()==) typ=;
else if(yin.size()==) typ=;
else{
typ=;
int mod=yin[];
spfa(mod);
}
}
// cout<<" typ "<<typ<<endl;
// prt(dis,0,yin[0]-1);
if(typ==){
ans[q[i].id]=;
}
else if(typ==){
if(q[i].n%yin[]==){
ans[q[i].id]=;
}
}else if(typ==){
// cout<<" typ==2 "<<endl;
ll x,y;
ll g=exgcd(yin[],yin[],x,y);
// cout<<" gg "<<g<<" "<<yin[0]<<" "<<yin[1]<<endl;
// cout<<"st "<<x<<" "<<y<<" : "<<x*yin[0]+y*yin[1]<<endl;
ll md=yin[]/g;
x=(x%md+md)%md;
if(q[i].n%g==){
x=(q[i].n/g)%md*x%md;
y=(q[i].n-x*yin[])/yin[];
// cout<<" x "<<x<<" y "<<y<<endl;
// cout<<" eql "<<x*yin[0]+y*yin[1]<<endl;
if(y>=){
ans[q[i].id]=;
}
}
}else{
if(dis[q[i].n%yin[]]<=q[i].n){
ans[q[i].id]=;
}
}
}
for(reg i=;i<=m;++i){
if(ans[i]) puts("YES");
else puts("NO");
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
PS:
以后解一个多元一次不定方程,最小的数不太大的时候,同余最短路都可以尝试!
CF986F Oppa Funcan Style Remastered的更多相关文章
- [CF986F]Oppa Funcan Style Remastered[exgcd+同余最短路]
题意 给你 \(n\) 和 \(k\) ,问能否用 \(k\) 的所有 \(>1\) 的因子凑出 \(n\) .多组数据,但保证不同的 \(k\) 不超过 50 个. \(n\leq 10^{1 ...
- 「CF986F」 Oppa Funcan Style Remastered
「CF986F」 Oppa Funcan Style Remastered Link 首先发现分解成若干个 \(k\) 的因数很蠢,事实上每个因数都是由某个质因子的若干倍组成的,所以可以将问题转换为分 ...
- codeforces986F Oppa Funcan Style Remastered【线性筛+最短路】
容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2<=n则有解,否则无解 然后剩下的情况最 ...
- [Codeforces 485F] Oppa Funcan Style Remastered
[题目链接] https://codeforces.com/contest/986/problem/F [算法] 不难发现 , 每个人都在且仅在一个简单环中 , 设这些环长的长度分别为 A1, A2 ...
- Codeforces 986F - Oppa Funcan Style Remastered(同余最短路)
Codeforces 题面传送门 & 洛谷题面传送门 感谢此题教会我一个东西叫做同余最短路(大雾 首先这个不同 \(k\) 的个数 \(\le 50\) 这个条件显然是让我们对每个 \(k\) ...
- 一句话题解&&总结
CF79D Password: 差分.两点取反,本质是匹配!最短路+状压DP 取反是套路,匹配是发现可以把操作进行目的化和阶段化,从而第二次转化问题. 且匹配不会影响别的位置答案 sequence 计 ...
- The Air Jordan 4 Oreo Remastered would be re-released in 2015
May be the Jordan 4 Oreo probably the most anticipated pair among the remastered Jordans for 2015? W ...
- JavaScript特性(attribute)、属性(property)和样式(style)
最近在研读一本巨著<JavaScript忍者秘籍>,里面有一篇文章提到了这3个概念. 书中的源码可以在此下载.我将源码放到了线上,如果不想下载,可以直接访问在线网址,修改页面名就能访问到相 ...
- obj.style.z-index的正确写法
obj.style.z-index的正确写法 今天发现obj.style.z-index在js里面报错,后来才知道在js里应该把含"-"的字符写成驼峰式,例如obj.style.z ...
随机推荐
- 【JZOJ5363】【NOIP2017提高A组模拟9.14】生命之树 Trie+启发式合并
题面 45 在比赛中,我只想到了45分的暴力. 对于一个树中点对,相当于在他们的LCA及其祖先加上这个点对的贡献. 那么这个可以用dfs序+树状数组来维护. 100 想法 我想到了可能要用trie树来 ...
- mysql过多sleep连接 修改timeout配置节约连接数 配置连接数
数据库连接数量我设置了16384,最大值 ; 对于mysql8在设置一下这个 SET GLOBAL mysqlx_max_connections = ; 可以使用 命令查看自己的设置 SHOW var ...
- 凸优化 & 1概念
---恢复内容开始--- 放射集合 系数之和为1 相加仍然能在集合内,就是 纺射集合 子空间加一个常熟 就是纺射集合 , 例题2.1 一类特殊的线性方程组的解可以看作纺射 集合 纺射包 aff C 是 ...
- 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划
1057 津津的储蓄计划 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 津津的零花钱一直都是 ...
- Fitnesse批量读取变量信息,并保存到用例执行上下文中
Fitnesse变量可以分成两种,一种是自定义变量,另一种是用例执行过程中的临时变量. 在Finesse使用过程中,如果需要定义一些公共的变量,可以统一在一个文件中使用自定义变量的方法,将公共变量全部 ...
- 模拟21 题解(waiting)
留坑待填 效率!!! 题还没改Oh,NO!!!
- webpack学习之—— Code Spliting(代码分离)
代码分离特性能够把代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件.代码分离可以用于获取更小的 bundle,以及控制资源加载优先级,如果使用合理,会极大影响加载时间. 有三种常 ...
- 各大ACM OJ网址
做快乐的程序员 以你的条件,你不必追求优秀,但你可以做到良好. 各大OJ网址 ACM OJ Collection(排名不分先后): 中国:(China) 华东地区: 浙江: 杭州电子科技大学(HDU) ...
- svn利用钩子脚本功能实现代码同步到web目录
一.hook简单介绍 为了方便管理员控制提交的过程 ,Subversion提供了hook机制.当特定的 事件发生时,相应的 hook会被调用,hook其实就相当于特定事件的处理函数.每个hook会得到 ...
- Vue 实现展开折叠效果
Vue 实现展开折叠效果 效果参见:https://segmentfault.com/q/1010000011359250/a-1020000011360185 上述链接中,大佬给除了解决方法,再次进 ...