模拟赛 c2-C product

题目描述

给定⼀个整数 。现在从 中选出若⼲个互不相同的整数,使它们的乘积模 等于 。
在满⾜条件的⽅案中,要使选出的整数尽量多。
请输出最多能选多少个整数,并输出⼀种⽅案。⽅案中的整数应按从⼩到⼤的顺序排列。

输⼊格式

⼀⾏⼀个整数 。

输出格式

第⼀⾏⼀个整数 ,表示最多能选出的整数数量。
第⼆⾏输出 个互不相同的整数,按从⼩到⼤的顺序排列。

样例 1

输⼊:
12
输出:
4
1 5 7 11

样例二

输入:
9
输出:
5
1 2 4 5 7

数据范围

\(2 \le n \le 10^5\)

算法分析

首先暴力dfs是不行的,会TLE。
经过一番观察,得出可以用逆元,处理一番后,得出了一下思路:

先算出1~n中有多少个数与n互质,记录下来,从小到大进行排序
然后如果这几个数的乘积模n为1,就输出这几个数。否则就不输出最后一个数,输出其他数。(语文不好)

AC代码

#include<bits/stdc++.h>
using namespace std;
int n;
int k = 0;
int cnt = 0;
int a[100005];
long long sum = 1;
int main(){
    cin>>n;
    for(int i = 1; i<n; i++){
        if(__gcd(i,n)==1){
            cnt++;
            sum = sum*i%n;
            a[++k] = i;
        }
    }
    if(sum==1){
        cout<<cnt<<'\n';
        for(int i = 1; i<=cnt; i++){
            cout<<a[i]<<" ";
        }
    }else{
        cout<<cnt-1<<'\n';
        for(int i = 1; i<cnt; i++){
            cout<<a[i]<<" ";
        }
    }
    return 0;
}
posted @ 2026-08-08 16:32  xmgene  阅读(7)  评论(0)    收藏  举报