Processing math: 5%

poj 2773 Happy 2016

题意:

给定m,k,找第k大与m互质的数

思路:

根据 gcd(a, b) = gcd(b * t + a, b) (t 为任意整数)

则如果ab互素,b * t + ab 也互素,否则 b * t + ab 不互素,故与m互素的数对m取模具有周期性。

假设小于m的数且与m互素的数有k个,第i个为a_i,则第n * k + i个与 m互素的数是n * m + a_i

 Code:

复制代码
#pragma GCC optimize(3)
#pragma GCC optimize(2)
#include <map>
#include <set>
// #include <array>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
// #include <unordered_map>

using namespace std;

typedef long long ll;
typedef pair<int, int> PII;

#define Time (double)clock() / CLOCKS_PER_SEC

#define sd(a) scanf("%d", &a)
#define sdd(a, b) scanf("%d%d", &a, &b)
#define slld(a) scanf("%lld", &a)
#define slldd(a, b) scanf("%lld%lld", &a, &b)

const int N = 1e6 + 20;
const int M = 1e6 + 20;
const int mod = 1e9 + 7;

int n, m, k;
int primes[N], cnt, phi[N];
bool st[N];

void get_eulers(int n)
{
    phi[1] = 1;
    for (int i = 2; i <= n; i++)
    {
        if (!st[i])
        {
            primes[cnt++] = i;
            phi[i] = i - 1;
        }
        for (int j = 0; primes[j] <= n / i; j++)
        {
            st[i * primes[j]] = true;
            if (i % primes[j] == 0)
            {
                phi[i * primes[j]] = primes[j] * phi[i];
                break;
            }
            phi[i * primes[j]] = (primes[j] - 1) * phi[i];
        }
    }
}

void solve()
{
    get_eulers(N - 20);
    while (~sdd(m, k))
    {
        n = k / phi[m];
        k %= phi[m];

        if (k == 0)
        {
            k = phi[m];
            n--;
        }

        for (int i = 1; i <= m; i++)
        {
            if (__gcd(i, m) == 1)
            {
                k--;
            }
            if (!k)
            {
                cout << n * m + i << "\n";
                break;
            }
        }
    }
}

int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("/home/jungu/code/in.txt", "r", stdin);
    // freopen("/home/jungu/code/out.txt", "w", stdout);
    // freopen("/home/jungu/code/out.txt","w",stdout);
#endif
    // ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int T = 1;
    // sd(T);
    while (T--)
    {
        solve();
    }

    return 0;
}
复制代码

 

posted @   君顾  阅读(102)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 2025成都.NET开发者Connect圆满结束
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络
点击右上角即可分享
微信分享提示