容易看出是用质因数凑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. Android之Handler使用方法总结

    方法一:(java习惯,在android平台开发时这样是不行的,由于它违背了单线程模型) 刚刚開始接触android线程编程的时候,习惯好像java一样,试图用以下的代码解决这个问题    new T ...

  2. linux中查看python的安装路径

    方法1:whereis python 查看所有python的路径,不止一个 方法2:which python 查看当前使用的python路径

  3. Database: key

    super-key: Any key that has more columns than necessary to uniquely identify each row in the table i ...

  4. mvn 创建的项目 导入到eclipse

    首先,我的工具版本如下: jdk: java version "1.6.0_10-rc2"; maven: apache-maven-3.1.0; eclipse: MyEclip ...

  5. 小米系列手机调试Installation failed with message Failed to establish session

    用Android studio 2.3调度程序时提示"Installation failed with message Failed to establish session"错误 ...

  6. HTML5 SVG实现过山车动画

    HTML5 SVG实现过山车动画是一款jQuery特效很酷的HTML5 SVG动画,这款HTML5动画是过山车效果,主要是利用了SVG的path动画来实现的,效果非常酷. http://www.hui ...

  7. SGU 495 Kids and Prizes:期望dp / 概率dp / 推公式

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=495 题意: 有n个礼物盒,m个人. 最开始每个礼物盒中都有一个礼物. m个人依次随 ...

  8. Object.is() Pollyfill

    if (!Object.is) { Object.is = function(x, y) { // SameValue algorithm if (x === y) { // Steps 1-5, 7 ...

  9. next enum in swift

    enum Iter: Int{ case s1=0, s2, s3, s4 mutating func next(){ if self == .s4 { self = .s1 return } sel ...

  10. 机器学习: R-CNN, Fast R-CNN and Faster R-CNN

    做语义分割的大概都知道这几篇文章了,将一个传统的计算机视觉模型,用CNN一点一点的替换,直到最后构建了一个完整的基于CNN的端到端的模型.这几篇文章有一定的连贯性.从中可以看到一种研究的趋势走向. 上 ...