是不是哪里写爆空间里?
#include <bits/stdc++.h>//ß÷ÄÚ¡«
#define re register//ß÷ÄÚ¡«
#define int long long
using namespace std;//ß÷ÄÚ¡«
typedef long long ll;
typedef long double ld;
const int N = 10004;//ß÷ÄÚ¡«ÒªÌîÊý×ÖÓ´¡«
const int M = 3.167e7 + 11;
const int MAXN = 1e5 + 5;
int prime[M],checkvis[M],cnt;
inline int read(){
int s = 0,f = 1;char c = getchar();
while (!isdigit(c)){if (c == '-')f = -1;c = getchar();}
while (isdigit(c)){s = (s<<3) + (s<<1) + (c ^ 48);c = getchar();}
return s * f;
}//ß÷ÄÚ¡«
int t;
vector<int> p;
long long dis[MAXN];
bool vis[MAXN];
struct node{
long long n,k;
int id;
friend bool operator < (const node x,const node y){
return x.k < y.k;
}
}a[N];
bool ans[N];
int qpow(long long x,long long y,long long mod){
long long res = 1;
for (;y;y>>=1,x=1LL*x*x%mod)
if (y & 1) res = res * x % mod;
return res;
}
void init(){
for (int i=2;i<M;i++){
if (!checkvis[i])
prime[++cnt] = i;
for (int j=1;j<=cnt && 1LL * prime[j] * i < 1LL * M;j++){
checkvis[prime[j] * i] = 1;
if (i % prime[j] == 0)break;
}
}
}
struct data{
int id;
long long dis;
friend bool operator < (const data x,const data y){
return x.dis > y.dis;
}
};
priority_queue<data> que;
void dijk(int n){
for (int i=0;i<n;i++)
dis[i] = 1e18 + 5;
memset(vis,0,sizeof(vis));
dis[0] = 0;que.push((data){0,0});
while (!que.empty()){
int u = que.top().id;que.pop();
if (vis[u])
continue;
vis[u] = 1;
for (int i=1;i < p.size();++i){
long long v = (u + p[i]) % n;
if (dis[u] + p[i] <= dis[v]){
dis[v] = dis[u] + p[i];
que.push((data){v,dis[v]});
}
}
}
}
signed main(){
init();
t = read();
long long x,y;
for (int i=1;i<=t;i++)
x = read(),y = read(),a[i] = (node){x,y,i};
sort(a+1,a+t+1);
int sum = 0;
for (int i=1,j=1;i <= t;i = j + 1,j = i){
p.clear();
while (j + 1 <= t && a[j+1].k == a[j].k)
++j;
long long x = a[i].k;
long long l = sqrt(x);
for (int k=1;prime[k] <= l;k++){
if (x % prime[k] == 0){
while (x % prime[k] == 0)
x /= prime[k];
p.push_back(prime[k]);
}
}
if (x > 1)
p.push_back(x);
if (p.size() == 1){
for (int k=i;k<=j;k++){
ans[a[k].id] = (a[k].n % a[k].k == 0);
}
continue;
} if (p.size() == 2){
int x = p[0],y = p[1];
int invy = qpow(y,x-2,x);
for (int k=i;k<=j;k++){
ans[a[k].id] = (y * ((1LL * a[k].n * invy) % x) <= a[k].n);
}
continue;
} else {
sort(p.begin(),p.end());
dijk(p[0]);
for (int k=i;k<=j;++k)
ans[a[k].id] = (dis[a[k].n % p[0]] <= a[k].n);
}
}
for (int i=1;i<=t;i++)
puts(ans[i] ? "YES" : "NO");
return 0;
}//ß÷ÄÚ¡«
/*
6
1863 2257
344 1829
178 235
79 1817
102 451
180 235
*/