Codefoces 432C Prime Swaps(数论+贪心)

题目连接:Codefoces 432C Prime Swaps

题目大意:给出一个序列,长度为n,要求用5n以内的交换次数使得序列有序,并且交换的i,j两个位置的数时要满足,j?i+1为素数。

解题思路:a数组为对应的序列,b数组为对应的有序序列,p为对应数的位置。每次从有序序列最小的位置开始,该为必须放b[i]才对,所以p[b[i]]=i,否则就要将b[i]尽量往前换,直到换到i的位置为止。

哥德巴赫猜想:任何一个大于5的数都可以写成三个质数之和。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1e5+5;

int n, a[N], b[N], p[N], v[N], r[5*N][2];

void init () {
    memset(v, 0, sizeof(v));

    for (int i = 2; i <= n; i++) {
        if (v[i])
            continue;

        for (int j = i * 2; j <= n; j += i)
            v[j] = 1;
    }

    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        b[i] = a[i];
        p[a[i]] = i;
    }
    sort(b+1, b+n+1);
}

int solve () {
    int c = 0;

    for (int i = 1; i <= n; i++) {
        while (p[b[i]] != i) {
            for (int j = i; j < p[b[i]]; j++) {
                if (!v[p[b[i]] - j + 1]) {
                    r[c][1] = p[b[i]];
                    r[c++][0] = j;

                    int t = p[b[i]];
                    p[b[i]] = j;
                    p[a[j]] = t;
                    swap(a[j], a[t]);
                    break;
                }
            }
        }
    }
    return c;
}

int main () {
    scanf("%d", &n);
    init();
    int c = solve();

    printf("%d\n", c);
    for (int i = 0; i < c; i++)
        printf("%d %d\n", r[i][0], r[i][1]);
    return 0;
}

Codefoces 432C Prime Swaps(数论+贪心)

时间: 2025-01-08 14:02:17

Codefoces 432C Prime Swaps(数论+贪心)的相关文章

CodeForces 432C Prime Swaps

Description You have an array a[1],?a[2],?...,?a[n], containing distinct integers from 1 to n. Your task is to sort this array in increasing order with the following operation (you may need to apply it multiple times): choose two indexes, i and j (1?

UVA 10140 - Prime Distance(数论)

10140 - Prime Distance 题目链接 题意:求[l,r]区间内最近和最远的素数对. 思路:素数打表,打到sqrt(Max)即可,然后利用大的表去筛素数,由于[l, r]最多100W,所以可以去遍历一遍,找出答案.注意1的情况,一开始没判断1,结果WA了 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define INF 0x3f

uva 10539 - Almost Prime Numbers(数论)

题目链接:uva 10539 - Almost Prime Numbers 题目大意:给出范围low~high,问说在这个范围内有多少个数满足n=pb,(p为素数). 解题思路:首先处理出1e6以内的素数,然后对于每个范围,用solve(high)?solve(low?1),solve(n)用来处理小于n的满足要求的数的个数.枚举素数,判断即可. #include <cstdio> #include <cstring> typedef long long ll; const int

Tsinsen A1504. Book(王迪) 数论,贪心

题目:http://www.tsinsen.com/A1504 A1504. Book(王迪) 时间限制:1.0s   内存限制:256.0MB   Special Judge 总提交次数:359   AC次数:97   平均分:43.76 将本题分享到: 查看未格式化的试题   提交   试题讨论 试题来源 2013中国国家集训队第二次作业 问题描述 Wayne喜欢看书,更喜欢买书. 某天Wayne在当当网上买书,买了很多很多书.Wayne有一个奇怪的癖好,就是第一本书的价格必须恰为X,而之后

uva 1404 - Prime k-tuple(数论)

题目链接:uva 1404 1404 - Prime k-tuple 题目大意:如果k个相邻的素数p1,p2,-,pk,满足pk?p1=s,称这些素数组成一个距离为s的素数k元组,给定区间a,b,求有多少个距离s的k元组. 解题思路:筛选素数法,先预处理出[1, sqrt(inf)]的素数表,然后对给定区间[a,b]根据预处理出的素数表筛选出素数即可. #include <cstdio> #include <cstring> #include <cmath> #incl

Codefoces 432 C. Prime Swaps(水)

思路:从前往后想将1调整好,在调整2....这样平均每次有五次机会调整,而且有相当一部分可能都用不到五次,可以一试.ac 代码: #include<iostream> #include<cstdio> #include<cmath> #include<map> #include<queue> #include<cstring> #include<algorithm> using namespace std; const i

HDU 2136 Largest prime factor 数论

Largest prime factor Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Everybody knows any number can be combined by the prime number. Now, your task is telling me what position of the largest prime factor. The

UVA 1521 - GCD Guessing Game(数论+贪心)

UVA 1521 - GCD Guessing Game 题目链接 题意:一个数字x在1-n之间,现在猜数字,每次猜一个数字a,告知gcd(x, a)的答案,问最坏情况下需要猜几次 思路:在素数上考虑,猜一组素数的乘积的数字,就可以把这些素数组成的数字都猜出来,答案就是组数,这样问题就是如何分组使得组数最小,每次取最后一个,尽量和前面小的合并,就能使得组数最小 代码: #include <cstdio> #include <cstring> #include <algorit

HDOJ 1319 Prime Cuts&lt;数论&gt;

学会了不难.通过这道题学习了两点: 1:筛选法求素数. 2:在写比较长的程序的时候,给每个功能部分加上注释,思路会更清晰. 题意: 1.题目中所说的素数并不是真正的素数,包括1: 2.需要读懂题意,对于输入的n和c,如果1到n之间有偶数个素数则打印2c个数,奇数个素数则打印2c-1个数: 3.打印的数是所有素数中位于中间位置的那些数. 4.虽然数据量n<100.但是应确定第100+个素数是那个数,稍微把数组开大一些. #include<iostream> #include<cstd