为什么我会MLE啊?
查看原帖
为什么我会MLE啊?
289056
北射天狼楼主2023/9/5 12:18

是不是哪里写爆空间里?

#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
*/
2023/9/5 12:18
加载中...