「CF986F」 Oppa Funcan Style Remastered

Link

首先发现分解成若干个 \(k\) 的因数很蠢,事实上每个因数都是由某个质因子的若干倍组成的,所以可以将问题转换为分解成若干个 \(k\) 的质因子之和。

此时质因子个数最多也就 \(12\) 个。

然后就不会了。

注意到题目可以转化为判断 \(\sum_{i=1}^kp_ix_i=n\) 是否有非负整数解。

且若 \(\sum_{i=1}^kp_ix_i=m\) 有解,则 \(\sum_{i=1}^kp_ix_i=m+p_i(1\le i\le k)\)一定 有解。

我们考虑在 \(\bmod p\) 意义下建出一张图。在 \((i,(i+p_i)\bmod p)\) 之间连边,然后跑最短路。

最后我们就只需要判断 \(\mathrm{dis}_{n\bmod p}\) 与 \(n\) 的大小关系即可。

注意本题在质因子个数 \(\le 2\) 时需要特判。

/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=4e6+5;
ll pri[maxn],cnt;
bool p[maxn*9];
ll P;
void init(){
for(ll i=2;i<=P;++i){
if(!p[i]) pri[++cnt]=i;
for(ll j=1;j<=cnt&&i*pri[j]<=P;++j){
p[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
}
ll a[50],tot;
ll dis[100005];
vector<pair<int,int> > e[100005];
priority_queue<pair<ll,ll> > Q;
void exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1,y=0;
return ;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
ll gcd(ll a,ll b){
if(!b) return a;
return gcd(b,a%b);
}
map<ll,ll> mp;
ll owo=0;
vector<pair<ll,ll>> q[100];
ll ans[10010];
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll T;cin>>T;P=sqrt(1e15+0.5);init();
for(ll _=1;_<=T;++_){
ll n,k;cin>>n>>k;
if(!mp[k]) mp[k]=++owo;
q[mp[k]].emplace_back(n,_);
}
for(auto xs:mp){
ll k,u;tie(k,u)=xs;tot=0;
for(ll i=1;i<=cnt&&1ll*pri[i]*pri[i]<=k;++i){
if(k%pri[i]==0){
a[++tot]=pri[i];
while(k%pri[i]==0) k/=pri[i];
}
}
if(k!=1) a[++tot]=k;
if(k==1){
for(auto x:q[u]){
ll n,id;tie(n,id)=x;
ans[id]=0;
}
}
else if(tot==1){
for(auto x:q[u]){
ll n,id;tie(n,id)=x;
if(n%a[1]) ans[id]=0;
else ans[id]=1;
}
}
else if(tot==2){
ll x,y;
exgcd(a[1],a[2],x,y);
x=(x%a[2]+a[2])%a[2];
for(auto xx:q[u]){
ll n,id;tie(n,id)=xx;
ll tx=n%a[2]*x%a[2];
ll ty=(n-a[1]*tx)/a[2];
if(ty<0) ans[id]=0;
else ans[id]=1;
}
}
else{
memset(dis,0x3f,sizeof dis);
for(ll i=0;i<a[1];++i) e[i].clear();
for(ll i=2;i<=tot;++i)
for(ll j=0;j<a[1];++j)
e[j].emplace_back((j+a[i])%a[1],a[i]);
dis[0]=0;Q.emplace(0,0);
while(!Q.empty()){
ll u;ll d;
tie(d,u)=Q.top();Q.pop();
d=-d;
if(d!=dis[u]) continue;
for(auto x:e[u]){
ll v,w;tie(v,w)=x;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
Q.emplace(-dis[v],v);
}
}
}
for(auto x:q[u]){
ll n,id;tie(n,id)=x;
if(dis[n%a[1]]<=n) ans[id]=1;
else ans[id]=0;
}
}
}
for(ll i=1;i<=T;++i){
cout<<(ans[i]?"YES":"NO")<<'\n';
}
return 0;
}

「CF986F」 Oppa Funcan Style Remastered的更多相关文章

  1. CF986F Oppa Funcan Style Remastered

    CF986F Oppa Funcan Style Remastered 不错的图论转化题! 题目首先转化成:能否用若干个k的非1因数的和=n 其次,因数太多,由于只是可行性,不妨直接都用质因子来填充! ...

  2. [CF986F]Oppa Funcan Style Remastered[exgcd+同余最短路]

    题意 给你 \(n\) 和 \(k\) ,问能否用 \(k\) 的所有 \(>1\) 的因子凑出 \(n\) .多组数据,但保证不同的 \(k\) 不超过 50 个. \(n\leq 10^{1 ...

  3. codeforces986F Oppa Funcan Style Remastered【线性筛+最短路】

    容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2<=n则有解,否则无解 然后剩下的情况最 ...

  4. [Codeforces 485F] Oppa Funcan Style Remastered

    [题目链接] https://codeforces.com/contest/986/problem/F [算法] 不难发现 , 每个人都在且仅在一个简单环中 , 设这些环长的长度分别为 A1, A2 ...

  5. Codeforces 986F - Oppa Funcan Style Remastered(同余最短路)

    Codeforces 题面传送门 & 洛谷题面传送门 感谢此题教会我一个东西叫做同余最短路(大雾 首先这个不同 \(k\) 的个数 \(\le 50\) 这个条件显然是让我们对每个 \(k\) ...

  6. 「CF150E」Freezing with Style「点分治」「单调队列」

    题意 给定一颗带边权的树,求一条边数在\(L\).\(R\)之间的路径,并使得路径上边权的中位数最大.输出一条可行路径的两个端点.这里若有偶数个数,中位数为中间靠右的那个. \(n, L, R\leq ...

  7. 使用「max-height」实现自适应高度

    .tab-content{ max-height: 0; overflow: hidden; -webkit-transition: max-height .8s; -moz-transition: ...

  8. 零元学Expression Blend 4 - Chapter 15 用实例了解互动控制项「Button」I

    原文:零元学Expression Blend 4 - Chapter 15 用实例了解互动控制项「Button」I 本章将教大家如何更改Button的预设Template,以及如何在Button内设置 ...

  9. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

随机推荐

  1. openresty 学习笔记五:访问RabbitMQ消息队列

    openresty 学习笔记五:访问RabbitMQ消息队列 之前通过比较选择,决定采用RabbitMQ这种消息队列来做中间件,目的舒缓是为了让整个架构的瓶颈环节.这里是做具体实施,用lua访问Rab ...

  2. windows使用attrib来简单隐藏文件

    效果如下: 详细命令说明: ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [+O | -O] [+I | -I] [+X | -X] [+P | -P] ...

  3. TensorFlow指定CPU和GPU方法

    TensorFlow指定CPU和GPU方法 TensorFlow 支持 CPU 和 GPU.它也支持分布式计算.可以在一个或多个计算机系统的多个设备上使用 TensorFlow. TensorFlow ...

  4. OpenCV读写视频文件解析

    OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在 OpenCV 中,VideoCapture ...

  5. selenium-python元素定位技巧(一)

    在python-selenium元素定位中,有很多小技巧,在此记录总结 技巧一.尽量不要用可见的文本去定位 尽量不要用可见的文本去定位(特别是支持国际化的软件-比如禅道),因为一旦切换语言后,使用该方 ...

  6. Java日期时间API系列39-----中文语句中的时间语义识别(time NLP 输入一句话,能识别出话里的时间)原理分析

    NLP (Natural Language Processing) 是人工智能(AI)的一个子领域.自然语言是人类智慧的结晶,自然语言处理是人工智能中最为困难的问题之一(来自百度百科). 其中中文更是 ...

  7. JUC 并发编程--08,线程池,三大方法,七大参数,4种拒绝策略,代码演示

    三大方法: //线程池核心线程数为n, 最大线程数为 n ExecutorService fixedThreadPool = Executors.newFixedThreadPool(n); 源码: ...

  8. pytest skip的使用

    skip跳过用例(无条件跳过,不运行用例) 使用方法: 1.使用跳过装饰器 class TestClass(): @pytest.mark.skip(reason='no way of current ...

  9. RabbitMQ由浅入深入门全总结(二)

    写在最前面 距离上一次发文章已经很久了,其实这段时间一直也没有停笔,只不过在忙着找工作还有学校结课的事情,重新弄了一下博客,后面也会陆陆续续会把文章最近更新出来~ 这篇文章有点长,就分了两篇 PS:那 ...

  10. OOP第三次总结Blog

    1. 前言 相比于前一次Blog题目集,此次七八九题目集偏重于类的继承.多态性使用方法以及接口的应用;在设计层面,强调模式复用,不断的迭代,若前期设计不合理,则后续的题目增加新的功能(即可扩展性)将会 ...