CF660A Co-prime Array

题意

给定 nn 和一个 nn 个元素的序列 a1,a2,,an(a1,a2,,an109)a_1, a_2, ……, a_n(a_1, a_2, ……, a_n \le 10^9),可以在任意一个 i,i+1i, i + 1 中间插入一个数 xx,其中 1x1091 \le x \le 10^9。现在要尽量插入较少的次数,使得任意 gcd(ai,ai+1)=1\gcd(a_i, a_{i+1}) = 1

分析

先给个质数表

明显,一个质数 xx 只有 11xx 两个因数,所以对于任意一个 p(1p<x)p(1 \le p < x)gcd(p,x)=1\gcd(p,x)=1,而与 xx 不互质的数有 xk(k1)x * k(k \ge 1),那么我们只需要在一个 gcd(ai,ai+1)1\gcd(a_i, a_{i+1}) \not = 1 中间插入一个大质数,例如 917120411917120411,而 2×917120411=1834240822>1092 \times 917120411 = 1834240822 > 10^9

但是有一种会被 hack,假设 a1,a2,,ana_1, a_2, ……, a_n 中有 ai=917120411a_i = 917120411,那么就不行,那么就输出 11 即可。

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1005;
int a[N];

int main()
{
    int n, cnt = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for (int i = 2; i <= n; i++)
    {
        cnt += (__gcd(a[i], a[i - 1]) != 1);
    }
    printf("%d\n", cnt);
    for (int i = 1; i < n; i++)
    {
        printf("%d ", a[i]);
        if (__gcd(a[i], a[i + 1]) != 1)
        {
            if (a[i] == 917120411) printf("1 ");
            else printf("917120411 ");
        }
    }
    printf("%d ", a[n]);
    return 0;
}
posted @   HappyBobb  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示