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 ...
随机推荐
- 操作系统 Lab1
练习1 1 ucore.img 是如何生成的 使用 make V= 查看详细的步骤 cc kern/init/init.c 使用cc工具进行预处理 gcc -Idir 将dir 作为查找目录(头文件) ...
- Leetcode33.Search in Rotated Sorted Array搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...
- optim.py cs231n
n如果有错误,欢迎指出,不胜感激 import numpy as np """ This file implements various first-order upda ...
- 详解TCP三握四挥
TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确 ...
- 深入理解 Node.js 进程与线程
原文链接: https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651557398&idx=1&sn=1fb991da ...
- LeetCode169 Majority Element, LintCode47 Majority Number II, LeetCode229 Majority Element II, LintCode48 Majority Number III
LeetCode169. Majority Element Given an array of size n, find the majority element. The majority elem ...
- 接口测试 Postman 做接口自动化测试_入门篇
可能是目前最好用的web接口调试工具 无需注册(注册后可多终端同步用例) 免费(每年付费$60可用云服务,30天免费试用) 保存历史记录 支持录制请求 基于Chrome的V8引擎,支持JS脚本(基本支 ...
- AI种黄桃AI卖黄桃 阿里巴巴推进一站式政务服务
7月11日,武汉城市峰会期间,武汉.枣阳.荆门等多个城市发布了同阿里巴巴的最新合作.这些合作包括用人工智能改善武汉交通拥堵.降低枣阳黄桃种植成本.提升荆门城市治理和市民服务水平等.阿里云.蚂蚁金服.高 ...
- 阿里云发布Apsara SA系列混合云存储阵列
3月21日,2019北京阿里云峰会上,阿里云正式发布Apsara SA系列混合云存储阵列,融合IP SAN,FC SAN,NAS和OSS对象存储协议于一体,同时实现了本地数据中心架构和公共云存储的无缝 ...
- 【JZOJ4861】【NOIP2016提高A组集训第7场11.4】推冰块
题目描述 Dpstr最近迷上了推冰块.冰地是一个n行m列的网格区域,第i行第j列的格子记为(i,j),也就是左上角为(1,1),右下角为(n,m).每个格子可能是冰面.障碍物.减速带三者之一.其中,冰 ...