蓝桥杯 互质子集

56 阅读1分钟

1.互质子集 - 蓝桥云课 (lanqiao.cn)

思想

首先创建个vector,vector用来存放所有满足条件的105的互质子集。

先给vector初始化1个元素,值为1,用j表示。然后我们用i去枚举2~105(1不用再枚举了,vetcor已经初始化1个1了),并且逐个与vector里面的元素作对比,如果i+j与105互质,那就把i加入到vector里面。

刚开始vector里面有1,当i为2的时候,1+2=3,不与105互质,2不加入到vector里面,i为3时,1+3=4,与105互质,3加入到vector里面,以此类推,这样vector里就存的全是i+j的和与105互质的数。

最后返回vector的size即可。

#include<bits/stdc++.h>
using namespace std;
int gcd(int a, int b) {
   return b?gcd(b,a%b):a;
}

int solve(int n) {
    vector<int> v{1}; // 初始结果列表包含数字1
    for (int i = 2; i <= n; ++i) {
        bool flag = true;
        for (int j : v) {
            if (gcd(j + i, 105) != 1) {
                flag = false;
                break;
            }
        }
        if (flag) {
           v.push_back(i);
        }
    }
    return v.size();
}

int main() {
    int n = 105;
    int cnt= solve(n);
    cout <<cnt;
    return 0;
}

python写法

from math import gcd

def solve(n):
    v = [1]  # 初始结果列表包含数字1
    for i in range(2, n + 1):
        flag = True
        for j in v:
            if gcd(j + i, 105) != 1:
                flag = False
                break
        if flag:
            v.append(i)
    return len(v)

if __name__ == "__main__":
    n = 105
    cnt = solve(n)
    print(" {}".format(cnt))