codeforces 222C C. Reducing Fractions(数论+构造)

题目链接:

codeforces 222C


题目大意:

给出两个集合,第一个集合数的乘积是分子,第二个集合的数的乘积是分母,要求够造一个同样的集合,但是得到的分数是化简过的。


题目分析:

-首先筛出素数,然后处理每一集合,统计每个集合的各个质因数出现的次数,然后每个质因数减去两个集合较小的那个的质因数的个数,然后利用每个集合约分后剩下的质因数构造出合法解即可,采用的对于每个数,贪心的除去被约分掉的部分。
- 筛取质因数不能采用 (n) 的方法会超时,构造时也不行,有一些利用数的性质的小的优化。


AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 100007

using namespace std;

typedef long long LL;

int a[MAX],b[MAX],n,m,mark[MAX*100];
int num1[MAX*100],num2[MAX*100];

void init ( )
{
    memset ( mark , 0, sizeof ( mark ) );
    mark[1] = mark[0] = 1;
    LL lim = 1e7;
    for ( LL i = 2 ; i <= lim; i++ )
    {
        if ( mark[i] ) continue;
        for ( LL j = i*i ; j <= lim; j+=i )
        {
            mark[j] = 1;
        }
    }
}

void _handle ( int num , int cnt[] )
{
    for ( int i = 2 ; i*i <= num &&mark[num];i++)
        while ( num%i == 0 )
        {
            cnt[i]++;
            num /= i;
        }
    if ( num > 1 ) cnt[num]++;
}

int _make ( int num , int cnt[])
{
    int ret = 1;
    for ( int i = 2 ; i*i <= num && mark[num];i++)
        while ( num%i == 0 )
        {
            if ( cnt[i] )
            {
                cnt[i]--;
                ret *= i;
            }
            num /= i;
        }
    if ( num > 1 && cnt[num] ) 
    {
        cnt[num]--;
        ret *= num;
    }
    return ret;
}

int main ( )
{
    init ( );
    while ( ~scanf ( "%d%d" , &n , &m ) )
    {
        memset ( num1 , 0 , sizeof ( num1 ) );
        memset ( num2 , 0 , sizeof ( num2 ) );
        int maxn = 0;
        for ( int i = 0 ; i < n ; i++ )
        {
            scanf ( "%d" , &a[i] );
            _handle ( a[i] , num1 );
            maxn = max ( a[i] , maxn );
        }
        for ( int i = 0 ; i < m ; i++ )
        {
            scanf ( "%d" , &b[i] );
            _handle ( b[i] , num2 );
            maxn = max ( b[i] , maxn );
        }
        for ( int i = 0 ; i <= maxn ; i++ )
        {
            int temp = min ( num1[i] , num2[i] );
            num1[i] -= temp;
            num2[i] -= temp;
        }
        printf ( "%d %d\n" , n , m );
        for ( int i = 0 ; i < n ; i++ )
            printf ( "%d " ,  _make ( a[i] , num1 ) );
        puts ("");
        for ( int i = 0 ; i < m ; i++ )
            printf ( "%d " ,  _make ( b[i] , num2 ) );
        puts ("");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,Codeforces Round 511 (Div. 1)是一个比赛的名称。然而,引用内容中没有提供与这个比赛相关的具体信息或问题。因此,我无法回答关于Codeforces Round 511 (Div. 1)的问题。如果您有关于这个比赛的具体问题,请提供更多的信息,我将尽力回答。 #### 引用[.reference_title] - *1* [Codeforces Round 860 (Div. 2)题解](https://blog.csdn.net/qq_60653991/article/details/129802687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Codeforces Round 867 (Div. 3)(A题到E题)](https://blog.csdn.net/wdgkd/article/details/130370975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Codeforces Round 872 (Div. 2)(前三道](https://blog.csdn.net/qq_68286180/article/details/130570952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值