容易看出是用质因数凑n

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

然后剩下的情况最小的质因数p1一定<=1e5,考虑在%p1的意义下做,考虑转成图论,点分别是%p1=x,然后对每个x连边(x+pi)%p1,边权为pi,跑最短路

如果dis[n%p1]<=n就合法,因为这表示可以用和小于n的若干数凑出和n在p1下同余的数,剩下部分用p1填即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int N=200005,M=31600000;
int t,p[M],tot,con;
long long dis[N],a[N];
bool v[M],ans[N],vis[N];
queue<int>q;
struct qwe
{
long long n,k,id;
}b[10005];
bool cmp(const qwe &a,const qwe &b)
{
return a.k<b.k;
}
long long read()
{
long long r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
long long ksm(long long a,long long b,long long mod)
{
long long r=1;
while(b)
{
if(b&1)
r=r*a%mod;
a=a*a%mod;
b>>=1;
}
return r;
}
int main()
{
t=read();
for(int i=1;i<=t;i++)
b[i].n=read(),b[i].k=read(),b[i].id=i;
v[1]=1;
for(int i=2;i<M;i++)
{
if(!v[i])
p[++tot]=i;
for(int j=1;j<=tot&&1ll*i*p[j]<M;j++)
{
v[i*p[j]]=1;
if(i%p[j]==0)
break;
}
}
sort(b+1,b+1+t,cmp);
for(int w=1;w<=t;w++)
{
long long n=b[w].n,k=b[w].k;
if(w==1||b[w].k!=b[w-1].k)
{
long long x=k;
con=0;
for(int i=1;i<=tot&&x>1;i++)
{
if(1ll*p[i]*p[i]>x)
{
a[++con]=x;
break;
}
if(x%p[i]==0)
{
a[++con]=p[i];
while(x%p[i]==0)
x/=p[i];
}
}
}
// for(int i=1;i<=con;i++)
// cerr<<a[i]<<" ";cerr<<endl;
if(con==0)
ans[b[w].id]=0;
else if(con==1)
ans[b[w].id]=(n%a[1]==0);
else if(con==2)
ans[b[w].id]=(1ll*n%a[1]*ksm(a[2],a[1]-2,a[1])%a[1]*a[2]<=n);
else
{
if(w==1||b[w].k!=b[w-1].k)
{
for(int i=1;i<=a[1];i++)
dis[i]=1e18;
dis[0]=0;
vis[0]=1;
q.push(0);
while(!q.empty())
{
int u=q.front();//cerr<<u<<endl;
q.pop();
for(int i=2;i<=con;i++)
{
int v=(u+a[i])%a[1];
if(dis[v]>dis[u]+a[i])
{
dis[v]=dis[u]+a[i];//cerr<<v<<endl;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
vis[u]=0;
}
}//cerr<<dis[n%a[1]]<<endl;
ans[b[w].id]=dis[n%a[1]]<=n;
}
}
for(int i=1;i<=t;i++)
puts(ans[i]?"YES":"NO");
return 0;
}

codeforces986F Oppa Funcan Style Remastered【线性筛+最短路】的更多相关文章

  1. CF986F Oppa Funcan Style Remastered

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

  2. 「CF986F」 Oppa Funcan Style Remastered

    「CF986F」 Oppa Funcan Style Remastered Link 首先发现分解成若干个 \(k\) 的因数很蠢,事实上每个因数都是由某个质因子的若干倍组成的,所以可以将问题转换为分 ...

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

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

  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. [Luogu]A%BProblem——线性筛素数与前缀和

    题目描述 题目背景 题目名称是吸引你点进来的[你怎么知道的] 实际上该题还是很水的[有种不祥的预感..] 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m接下来n行, ...

  7. bzoj2693--莫比乌斯反演+积性函数线性筛

    推导: 设d=gcd(i,j) 利用莫比乌斯函数的性质 令sum(x,y)=(x*(x+1)/2)*(y*(y+1)/2) 令T=d*t 设f(T)= T可以分块.又由于μ是积性函数,积性函数的约束和 ...

  8. BZOJ 2693: jzptab [莫比乌斯反演 线性筛]

    2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1194  Solved: 455[Submit][Status][Discu ...

  9. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

随机推荐

  1. 用c++后缀自动机实现最大公共字符串算法,并封装成Python库

    后缀自动机的C++代码转自https://e-maxx.ru/algo/suffix_automata,其余封装为自写. 在C++文件同级目录建立setup.py文件,代码如下: # !/usr/bi ...

  2. API的理解和使用——集合

    集合类型的命令及时间复杂度  区间 命令 功能 时间复杂度  集合内 sadd key element [element ... ]  添加元素 O(k),k是元素个数 srem key elemen ...

  3. JETSON TK1 ~ 控制GPIO

    首先建立个存放gpio代码的文件夹,CD到该文件夹. git clone git://github.com/derekmolloy/boneDeviceTree/ 解压后会出现几个文件 GPIO文件夹 ...

  4. PAT 乙级 1084. 外观数列 (20) 【字符串】

    题目链接 https://www.patest.cn/contests/pat-b-practise/1084 思路 用字符串模拟 然后要注意一点 它是连续的 才并在一起 就比如说 d, d1, d1 ...

  5. 关于LCD的duty与bias

    关于LCD的duty与bias 关于LCD的duty与bias duty: 占空比将所有公共电极(COM)各施加一次扫描电压的时间叫一帧,单位时间内扫描多少帧的频率叫帧频,将扫描公共电极(COM)选通 ...

  6. BZOJ 3671 NOI2014 随机数生成器

    这题其实是个暴力. 首先那一堆如何构造n*m方格的东西都是在玩你. 构造出来方阵后,由于是一个排列,不存在重复,可以大力贪心. 每次将选出一个最小的元素,然后将它右上左下的元素全部打上标记(记得bre ...

  7. <算法笔记>关于快速排序的算法优化排序(顺便给百度百科纠个错)

    快速排序是排序算法之中的基本中的基本,虽然越来越多的接口函数将快速排序“完美的封装了起来”,比如C++中的qsort或者<algorithm>中的sort(与stable_sort相对应) ...

  8. 算法(Algorithms)第4版 练习 1.3.13

    (a) 0 1 2 3 4 5 6 7 8 9 (b) 4 6 8 7 5 3 2 9 0 1 (c) 2 5 6 7 4 8 9 3 1 0 (d) 4 3 2 1 0 5 6 7 8 9 答案:b ...

  9. 作业3rd

    第三周作业 课本学习 使用nmap扫描特定靶机 使用nessus扫描特定靶机 靶机网络情况如下 在攻击机使用Nessus,步骤如下 新建一个扫描 填入目的主机ip,点击开始进行扫描 等待 扫描结果如下 ...

  10. 1107 Social Clusters (30)(30 分)

    When register on a social network, you are always asked to specify your hobbies in order to find som ...