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)