D. The Number of Pairs

2024-04-27 12:18
文章标签 number pairs

本文主要是介绍D. The Number of Pairs,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门

(我发现这样的题目都是分解因子)

我们设a = Ag, b = Bg, lcm = (Ag * Bg) / g = AB * g, 此时方程可化为g(c * AB - d) = x。由此我们可以知道,g一定为x的一个因子, 那么(cAB - d)就是另外一个因子。当我们求得一个因子i,令g = i, 则 AB * c = x/i + d, 当x/i + d能被c整除时,我们可以得到AB的值。因为gcd(A,B) == 1,所以当我们找出AB的素因子后,该因子一定只能是A,B其中一个的因子,所有我们可以找出AB的所有素因子将他们分配给A和B,一共就有2^cnt种情况( C(n,0) + C(n, 1) …)
a = A
g, b = B*g, 故a, b的组合数就等于A, B的组合数.

算法实现

#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<utility>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cctype>
using namespace std;typedef long long LL;           //数据太大了记得用LL,还有把INF也得换
typedef pair<int, int> P;const int maxn = 2e7+10;        //cf数组最多差不多是这么多,1e8就会段错误
const int V_MAX = 800 + 10;
const int mod = 10007;
const int INF = 0x3f3f3f3f;     //如果数据范围为long long,记得把INF的值换了
const double eps = 1e-6;        //eps开太小二分容易死循环,所以直接来个100次循环就好了//多组输入时,maxn太大,用memset()会超时,血的教训;int mind[maxn], val[maxn];void solve() {int c, d, x;cin >> c >> d >> x;int res = 0;for(int i = 1; i*i <= x; i++) {if(x % i != 0) continue;int k1 = x/i + d;if(k1 % c == 0) res += 1 << val[k1 / c];if(i * i == x) continue;int k2 = i + d;if(k2 % c == 0) res += 1 << val[k2 / c];}cout << res << endl;
}int main()
{ios::sync_with_stdio(false);           //关了流同步就别用c的输入//freopen("D:\\in.txt", "r", stdin);//先求出每个数的素因子个数.memset(mind, -1,sizeof mind);mind[1] = 1;for(int i = 2; i <= maxn; i++) {if(mind[i] == -1) {for(int j = i; j <= maxn; j += i) {mind[j] = i;}}}for(int i = 2; i <= maxn; i++) {int t = i / mind[i];val[i] = val[t] + (mind[i] != mind[t]);}int t; cin >> t;while(t--) {solve();}return 0;
}

这篇关于D. The Number of Pairs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940483

相关文章

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置版本号生成 打开项目配置页面。在下方找到 “Build Env

【Hdu】Minimum Inversion Number(逆序,线段树)

利用线段树在nlogn的时间复杂度内求一段数的逆序。 由于给的序列是由0 ~ n -1组成的,求出初始的逆序之后可以递推出移动之后的逆序数。 #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const in

【JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

基本数据类型   JavaScript基本数据类型包括:undefined、null、number、boolean、string。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值。 1)基本数据类型的值是不可变的 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = "change";name.substr();//hangconsole.log

ORA-24067: exceeded maximum number of subscribers for queue ADMIN.SMS_MT_QUEUE

临时处理办法: delete from aq$_ss_MT_tab_D;delete from aq$_ss_MT_tab_g;delete from aq$_ss_MT_tab_h;delete from aq$_ss_MT_tab_i;delete from aq$_ss_MT_tab_p;delete from aq$_ss_MT_tab_s;delete from aq$

SQLSERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER

SQL SERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER 前言 本文意于用实例数据帮助理解SQL SERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER。 准备工作 创建测试表:   ? 1 2 3 4 5 create table test( id int identity(1,1)

[LeetCode] 137. Single Number II

题:https://leetcode.com/problems/single-number-ii/ 题目大意 给定array,其中有一个元素只出现了1次,其他元素都出现了3次。 思路 求和 减去 (set(array)*3 - array)/2 作为答案。 class Solution {public int singleNumber(int[] nums) {Set<Long> se

Oracle - ORA-01789: Query block has incorrect number of result columns

一、原因     这个错误一般是在执行表之间的相加(union),相减(minus)等SQL语句时,两个个查询块具有不一致的结果列数所导致的。 二、方案     只要将两段SQL语句的列数调整为一致就可以解决。使用union时,要注意数据库字段的格式要一致,如varchar和nvarchar是不一样的。