萌新求助
查看原帖
萌新求助
114082
Sya_Resory楼主2021/1/27 21:53

RT. 样例过了 但是测试点全WA

code:

#include <cstdio>
#include <algorithm>
#define int long long

const int maxn = 1e6 + 5;

int t;
int n,d,min_g,c,cnt_fac,g[maxn];
int phi[maxn],pri[maxn],fac[maxn];
bool isp[maxn];

inline int read() {
#define gc c = getchar()
    int d = 0;
    int f = 0,gc;
    while(c < 48 || c > 57) f |= (c == '-'),gc;
    while(c > 47 && c < 58) d = (d << 1) + (d << 3) + (c ^ 48),gc;
#undef gc
    return f ? -d : d;
}

inline void getPhi(int n) {
    phi[1] = 1;
    for(int i = 2;i <= n;i ++) {
        if(!isp[i]) pri[++ pri[0]] = i,phi[i] = i - 1;
        for(int j = 1;j <= pri[0] && i * pri[j] <= n;j ++) {
            isp[i * pri[j]] = true;
            if(!(i % pri[j])) {
                phi[i * pri[j]] = phi[i] * pri[j];
                break;
            } else phi[i * pri[j]] = phi[i] * (pri[j] - 1);
        }
    }
    return ;
}

int gcd(int a,int b) {
    if(!b) return a;
    return gcd(b,a % b);
}

int fpow(int a,int b,int mod) {
    int res = 1;
    a %= mod;
    while(b) {
        if(b & 1) res = res * a % mod;
        a = a * a % mod,b >>= 1;
    }
    return res;
}

void getFactor(int n) {
    cnt_fac = 0;
    int p = phi[n];
    for(int i = 2;i * i <= p;i ++)
        if(!(p % i)) {
            fac[++ cnt_fac] = i;
            while(!(p % i)) p /= i;
        }
    if(p > 1) fac[++ cnt_fac] = p;
    return ;
}

bool exist(int n) {
    if(!(n & 1)) n >>= 1;
    if(n == 1 || n == 2) return true;
    if(!(n & 1)) return false;
    for(int i = 3;i * i <= n;i ++) {
        if(!(n % i)) {
            while(!(n % i)) n /= i;
            break;
        }
    }
    return n == 1;
}

bool chkG(int g,int p) {
    if(fpow(g,phi[p],p) != 1) return false;
    for(int i = 1;i <= cnt_fac;i ++)
        if(fpow(g,phi[p] / fac[i],p) == 1) return false;
    return true;
}

int getMinG(int n) {
    for(int i = 1;i < n;i ++) if(chkG(i,n)) return i;
}

int getAllG(int n,int gx) {
    int mul = 1,cnt = 0;
    for(int i = 1;i <= phi[n];i ++) {
        mul = 1ll * mul * gx % n;
        if(gcd(i,phi[n]) == 1) g[++ cnt] = mul;
    }
    return cnt;
}

void solve(int n,int d) {
    if(exist(n)) {
        getFactor(n);
        min_g = getMinG(n);
        c = getAllG(n,min_g);
        std::sort(g + 1,g + c + 1);
        printf("%lld\n",c);
        for(int i = 1;i <= c / d;i ++)
            printf("%lld ",g[i * d]);
        puts("");
    } else puts("0\n");
    return ;
}

signed main() {
    getPhi(1e6);
    t = read();
    for(;t;t --) {
        n = read(),d = read();
        solve(n,d);
    }
    return 0;
}
2021/1/27 21:53
加载中...