Codeforces Round #716 (Div. 2) C. Product 1 Modulo N

Posted TURNINING

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #716 (Div. 2) C. Product 1 Modulo N相关的知识,希望对你有一定的参考价值。

传送门

题意:一个序列1 到 n-1 从中找到最长的子序列使他们的乘积 mod n == 1;

思路:我想的是找到最大的子序列乘积为 nk + 1,就是这个+1,我没有往深入想,显然 nk + 1 与 n 互质,所以我们要选择的元素必须与n互质。

我们从头开始乘,如果最后结果 mod n == 1,结果就是这个序列,若不是,我们在乘的过程中跳过这个数,结果相当于是除了它本身,结果为1。

#include<bits/stdc++.h>
using namespace std;
 
typedef long long LL;   //不开long long见祖宗
typedef pair<int, int> P;

const int maxn = 1e5 + 10;
const int max_log_n = 20;
const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
const LL mod = 1e9 + 7;

int n;
vector<int> arr;

void solve() { 
    cin >> n;
    for(int i = 1; i < n; i++) {
        if(__gcd(i, n) == 1) 
            arr.emplace_back(i);
    }
    LL temp = 1;
    for(int i = 0; i < arr.size(); i++) {
        temp *= arr[i];
        temp %= n;
    }
    if(temp == 1) {
        cout << arr.size() << endl;
        for(int i = 0; i < arr.size(); i++) 
            cout << arr[i] << " ";
    }
    else {
        cout << arr.size() - 1 << endl;
        for(int i = 0; i < arr.size(); i++) {
            if(arr[i] == temp) continue;
            cout << arr[i] << " ";
        }
    }
    cout << endl;
}   


int main() {
    ios::sync_with_stdio(false);
    int t = 1; 
    while(t--) {
        solve();
    }
    return 0;
}

以上是关于Codeforces Round #716 (Div. 2) C. Product 1 Modulo N的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #716 (Div. 2) C. Product 1 Modulo N

Codeforces Round #716 (Div. 2), B. AND 0, Sum Big, 快速幂结论题

Codeforces Round #716 (Div. 2) C. Product 1 Modulo N

7.26-Codeforces Round #372 (Div. 2)

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)