「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. SLAM的通用框架:GSLAM

    SLAM的通用框架:GSLAM GSLAM: A General SLAM Framework and Benchmark 论文链接: http://openaccess.thecvf.com/con ...

  2. “ compiler-rt”运行时runtime库

    " compiler-rt"运行时runtime库 编译器-rt项目包括: Builtins-一个简单的库,提供了代码生成和其他运行时runtime组件所需的特定于目标的低级接口. ...

  3. 【NX二次开发】Block UI 选择小平面区域

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  4. Java显式锁

    Java 显式锁. 一.显式锁 什么是显式锁? 由自己手动获取锁,然后手动释放的锁. 有了 synchronized(内置锁) 为什么还要 Lock(显示锁)? 使用 synchronized 关键字 ...

  5. 【题解】斐波拉契 luogu3938

    题目 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子. ...

  6. 查询表空间总大小(dba_data_files和dba_segments,dba_free_space区别)

    1, dba_data_files,dba_segments,dba_free_space得出结论:一般情况下(没有drop表的时候):dba_data_files bytes = (dba_segm ...

  7. 跟着官方文档学Maven构建生命周期

    在IntelliJ IDEA中,显示了Maven的Lifecycle: 只需要学习这些命令,就能构建一个Maven项目. 三个内置生命周期 Maven内置了三个生命周期:clean.default和s ...

  8. 小程序动态修改页面标题setNavigationBarTitle

    可以使用setNavigationBarTitle方法动态设置页面标题 wx.setNavigationBarTitle({ title: options.name, })

  9. .NET 云原生架构师训练营(Identity Server)--学习笔记

    目录 OAuth 2.0 OpenID Connect QuickStart OAuth 2.0 概念 过程 通信 组件 示例代码 概念 OAuth 2.0 是一个授权协议,它允许软件应用代表(而不是 ...

  10. 43、uniq命令

    相邻去重 uniq -c 表示相邻去重并统计: 1.uniq介绍: uniq是对指定的ascii文件或标准输入进行唯一性检查,以判断文本文件中重复出现的行,常用于系统排查及日志分析: 2.命令格式: ...