首页 > 其他分享 >CF1499D The Number of Pairs 题解 线性筛

CF1499D The Number of Pairs 题解 线性筛

时间:2024-11-18 16:44:47浏览次数:1  
标签:Pairs frac gcd int 题解 cdot maxn CF1499D lcm

题目链接:https://codeforces.com/problemset/problem/1499/D

题目大意:

给你三个整数 \(c, d, x\)(\(1 \le c,d,x \le 10^7\)),问:存在多少对正整数对 \((a, b)\) 满足:

\[c \cdot lcm(a, b) - d \cdot gcd(a, b) = x \]

其中,\(lcm(a, b)\) 表示整数 \(a\) 和 \(b\) 的最大公约数,\(gcd(a, b)\) 表示整数 \(a\) 和 \(b\) 的最小公倍数。

解题思路:

令 \(gcd(a, b) = k\),\(a = Ak, b = Bk\),且 \(gcd(A, B) = 1\)

则等式

\(c \cdot lcm(a, b) - d \cdot gcd(a, b) = x\)

可以转成

\(cABk - dk = x\)

\(cAB - d = \frac{x}{k}\)

即 \(k \ |\ x\)

所以我们可以 \(O(\sqrt{x})\) 枚举 \(x\) 的因数 \(k\)。

在 \(k\) 确定是,令 \(y = \frac{x}{k} + d\),则

\(cAB = y\)

\(AB = \frac{y}{c}\)

又因为 \(A\),\(B\) 是互质的(\(gcd(A,B) = 1\)),所以

设 \(\frac{y}{c}\) 的不同质因子个数为 \(z\),则\((A, B)\) 有 \(2^k\) 个。

总时间复杂度 \(O(t \sqrt{x})\)。

当时需要先线性筛求出 \(2 \cdot 10^7\) 范围内每个数的不同质因子个数。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e7 + 5;
int prime[maxn/10], cnt, num[maxn];
bool isp[maxn];

void init(int n) {
    for (int i = 2; i <= n; i++) {
        if (!isp[i])
            prime[cnt++] = i, num[i] = 1;
        for (int j = 0; j < cnt && i * prime[j] <= n; j++) {
            isp[ i * prime[j] ] = true;
            if (i % prime[j])
                num[ i * prime[j] ] = num[i] + 1;
            else {
                num[ i * prime[j] ] = num[i];
                break;
            }
        }
    }
}

long long cal(int c, int d, int x) {
    long long ans = 0;
    vector<int> vec;
    for (int i = 1; i * i <= x; i++) {
        if (x % i == 0) {
            vec.push_back(i);
            if (i * i < x)
                vec.push_back(x/i);
        }
    }
    for (auto k : vec) {
        int y = x / k + d;
        if (y % c == 0) {
            ans += 1LL << num[y/c];
        }
    }
    return ans;
}

int T, c, d, x;

int main() {
    init(2e7);
    scanf("%d", &T);
    while (T--) {
        scanf("%d%d%d", &c, &d, &x);
        printf("%lld\n", cal(c, d, x));
    }
    return 0;
}

标签:Pairs,frac,gcd,int,题解,cdot,maxn,CF1499D,lcm
From: https://www.cnblogs.com/quanjun/p/18553012

相关文章

  • [ABC380C] Move Segment 题解
    [ABC380C]MoveSegment题解本题主要考察思维能力,其实不难。题目大意给你一个字符串\(s\),\(s\)由\(0\)和\(1\)构成,将其分为块中只有一种数字的块。将给定的第\(k\)块数字为\(1\)的块与第\(k-1\)块合并,并输出修改后的字符串。思路分析直接按照题意模拟即可。建......
  • CF 705 题解
    CF705题解AHulk模拟即可.BSpiderMan打sg表可以发现,奇数个球先手必败(sg=0),偶数先手必胜(sg=1).多个组合只要把sg值异或起来就好.CThor暴力模拟就可以了,用队列模拟.DAntMan结论:按照编号由小到大加入链表,每次尽量让答案最小贪心就是对的.若原来是......
  • CF1023题解
    CF1023A一眼秒之题因为整个s串至多有1个*号,所以可以把s串分为两个部分分别与t串的前后进行匹配,看看前后能不能适配即可注意特判没有*的情况CF1023B一眼秒之题+1简单的,就是一个数k拆成两个数之和,这两个数的值域为(1,n),分讨k为奇偶,然后简单转化即可CF1023C小清新一眼秒之题+1......
  • 题解:CF contest 2037 : [Codeforces Round 988 (Div. 3)] (A-E)
    ATwice题面Kinich醒来迎接新的一天的开始。他打开手机,查看邮箱,发现了一份神秘的礼物。他决定打开礼物的盒子。Kinich用\(n\)整数打开数组\(a\)。最初,Kinich的分数是\(0\)。他将执行任意次数的以下操作:—选择两个索引\(i\)和\(j\)\((1\leqi\lt;j\leqn)\),确......
  • CF1731题解
    推荐食用方法:直接看本人的题面翻译即可,如有写题需要,可以交CF这套题T3、T5质量较高,值得认真思考,T2很神仙,T1、T4相对不太出彩,你问为什么没有T6?因为蒟蒻不会套题洛谷链接套题CF链接T1题面翻译给定一个正整数序列,每次可以将两个数替换为与之乘积相等的两个数,求任意次操作后最大......
  • JMeter响应乱码问题解决方案教程
    前言      ApacheJMeter是性能测试领域的强大工具,但在使用过程中,测试人员常会遇到响应乱码的问题。乱码不仅影响测试结果的可读性,还可能掩盖关键信息,对测试准确性构成威胁。本教程将深入探讨JMeter响应乱码问题的根源,并提供实用的解决方案。你将学习如何识别乱码现象......
  • [ARC187B] Sum of CC 题解
    若\(i\)与\(j\)有边,也就是\(a_i<a_j\),那么对于一个\(i<k<j\),会发现\(a_k>a_i\)和\(a_k<a_j\)至少满足一个。也就是说\(k\)也一定和\(i,j\)联通。于是我们发现了一个关键性质:所有联通块都为一个区间。那我们考虑\(i\)和\(i+1\)什么时候不联通:\(i\)之前的任......
  • AtCoder Beginner Contest 380 (A~E)题解
    A-123233遍历字符串统计出现次数即可。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e6+10;intn,m,k;inta[N];signedmain(){ strings; cin>>s; map<char,int>mp; for(autot:s){ mp[t]++; } if(......
  • P10124 [USACO18OPEN] Family Tree B 题解
    思路这道题目很像找\(2\)头牛的最近公共祖先,即lca,但是并不用那么麻烦.因为数据很小,我们可以写一个山寨版的lca.具体如下.intmother(stringx,stringy){ intres=0; while(y!=""){//有名字的牛 if(x==y)returnres;//两头牛的名字相等,说明是同......
  • [AGC032B] Balanced Neighbors 题解
    考虑先写个暴力\(O(n2^m)\)的输出一下结果,看一下n=4,5,6的(尤其是n=6的)结果,尤其是每个点像其余哪几个点连边,然后就想到了构造方案。代码constintN=109;intn;inte[N][N];voidskymaths(){read(n);if(n%2==0){rep(i,1,n){......