首页 > 其他分享 >分成互质组

分成互质组

时间:2023-06-23 17:14:12浏览次数:31  
标签:分成 cnt return int back ++ 互质

分成互质组

DFS 做法

1.跳出条件

(1). 当当前遍历数字越界时,跳出

(2). 当当前答案比原答案大于等于时,跳出

2.DFS 递归

将这一个数放到每一组里去判断是否与里面的数字两两互质,如果行,就放入该组里。

​ 然后递归 ——> 回溯

如果全部都不行就新开一个组

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;
const int N = 15;

int n, a[N], cnt, ans = N;
vector<int> p[N], aw[N];

// 计算a, b的最大公约数
int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

// 判断x是否与里面的数字两两互质
bool check(int x, int i)
{
    for(int j = 0; j < p[i].size(); j ++ )
        if(gcd(x, p[i][j]) > 1)
            return false;
    return true;
}

// 对n个数据进行搜索
void dfs(int u)
{
    if(cnt >= ans)
        return;
    if(u > n)
    {
        for(int i = 0; i < n; i ++ )
            vector<int>().swap(aw[i]);
        for(int i = 0; i < cnt; i ++ )
            for(int j = 0; j < p[i].size(); j ++ )
                aw[i].push_back(p[i][j]);
        ans = cnt;
        
        return;
    }
    
    // 遍历cnt个数据
    for(int i = 0; i < cnt; i ++ )
    {
        // 将a[u]放到每一组里去判断是否与里面的数字两两互质
        if(check(a[u], i))
        {
            // 将a[u]添加到p[i]中
            p[i].push_back(a[u]);
            // 递归搜索
            dfs(u + 1);
            // 回溯 将a[u]从p[i]中移除
            p[i].pop_back();
        }
    }
    //如果与所有的都不能兼容
    // 将a[u]添加到p[cnt]中
    p[cnt ++ ].push_back(a[u]);
    // 递归搜索
    dfs(u + 1);
    // 回溯 将a[u]从p[cnt]中移除
    p[-- cnt].pop_back();
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++ )
        cin >> a[i];
        
    // 对n个数据进行搜索
    dfs(1);
    
    cout << ans << endl;
    // 遍历ans个数据
    for(int i = 0; i < ans; i ++ )
    {
        // 遍历aw[i]中的每一个数据
        for(int j = 0; j < aw[i].size(); j ++ )
            cout << aw[i][j] << ' ';
            cout << aw[i][j] <<'';
        cout << endl;
    }
    return 0;
}

标签:分成,cnt,return,int,back,++,互质
From: https://www.cnblogs.com/ljfyyds/p/17499347.html

相关文章

  • 截取某列数组元素里的一部分成为一个新列数组
    参考: https://www.coder.work/article/3220624  spark2.4的新方法Spark2.4引入了新的SQL函数 slice,可用于从数组列中提取一定范围的元素。 ......
  • excel一个sheet拆分成几个文件
    #-*-coding:utf8-*-importpandasaspdfile_name='查询银行汇总_20w.xlsx'file_name_prefix=file_name.split('.')[0]df=pd.DataFrame(pd.read_excel(file_name))#每个文件的行数file_num=35000#共分成多少个文件sheet_num=float(df.shape[0]/fi......
  • 把一个整数拆分成两个平方的和 $x^2+y^2=n$
    首先是一个结论,若\(n=2^\alpha\prodp_i^{\beta_i}\prodq_i^{2\gamma_i}\),其中\(p_i\equiv1\pmod4,q_i\equiv3\pmod4\),那么有解,否则无解。然后考虑如果\(n_1=x_1^2+y_1^2,n_2=x_2^2+y_2^2\),那么\(n_1n_2\)也是可以被表示的,即\(n_1n_2=(x_1y_1+x_2y_2)^2+(x_1y_2-x......
  • Python把列表中的数字尽量等分成n份
    问题描述:假设一个列表中含有若干整数,现在要求将其分成n个子列表,并使得各个子列表中的整数之和尽可能接近。下面的代码并没有使用算法,而是直接将原始列表分成n个子列表,然后再不断地调整各个子列表中的数字,从元素之和最大的子列表中拿出最小的元素放到元素之核最小的子列表中,重复这个......
  • python 视频拆分成帧,帧合成视频
    参考python将视频切分成帧&&帧合成视频,下面的代码来自这篇博客。#====================视频拆分成帧===================================importcv2defvideo2frame(videos_path,frames_save_path,time_interval):''':paramvideos_path:视频的存放路径:par......
  • 【Azure 媒体服务】Azure Media Service上传的视频资产,如何保证在Transfer编码后音频
    问题描述AzureMediaService上传的视频资产,如何保证在Transfer编码后音频文件和视频文件不分成两个文件?保持在一个可以直接播放的MP4文件中呢? 问题解答AzureMediaService上提供的Build-inTransform生成的资产中,音频与视频分别存储在不同的文件中。通过自定义StandardEncode......
  • 【Azure 媒体服务】Azure Media Service上传的视频资产,如何保证在Transfer编码后音频
    问题描述AzureMediaService上传的视频资产,如何保证在Transfer编码后音频文件和视频文件不分成两个文件?保持在一个可以直接播放的MP4文件中呢? 问题解答AzureMediaService上提供的Build-inTransform生成的资产中,音频与视频分别存储在不同的文件中。通过自定义StandardE......
  • 求一个数所有因子的集合的子集中满足所有数均互质的最大子集
    题意:很明显了,就是把数n的所有因子求出来,在里面挑选一些数,使这些数之间均互质,求这些的最大个数。结论:先讲结论:最大个数为数n的质因数个数加1思路:我们已知一个数的质因数,就可以把这个数表示成若干质因数的乘积,例如:12=2*2*3;其中2,3是12的质因数,表达式中2的个数是2,3的......
  • RSA(共模、低指数、素数分解、模不互质)
    buuctf:rsa3题目c1=22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084......
  • 【并发编程】Java7 - ForkJoin,将大任务拆分成小任务
    1.简介  Java7提供了可以将大任务拆分成小任务执行再合并结果的框架——Fork/Join。其中,将大任务拆分成足够执行的小任务并发执行的过程称为Fork,将这些小任务结果整合后形成最终的结果的过程称为Join。  Fork/Join框架的具体体现为ForkJoinTask抽象类,该类继承了Future,运行......