首页 > 其他分享 >每日一题-数论

每日一题-数论

时间:2022-12-13 17:26:15浏览次数:39  
标签:cout Chain 数论 每日 Lucky int 因子 一题

Codeforces edu round 139 D - Lucky Chains

问题描述

给正整数\(x, y(x<y)\), 如果\(gcd(x, y), gcd(x+1, y+1) \dots gcd(x+k, y+k)都为1\), 则称这些数为Lucky Chain, 求\(x, y\)最长的Lucky Chain的长度, 如果这条链可以无限长, 输出-1

数论

\[假设使Lucky Chain断开的第一个元素为x+k, y+k,\\ 则x+k, y+k有公因子p.\\则有:\\ \begin{cases} x+k=np\\ y+k=mp (n,m为整数)\\ \end{cases}\\ 可化为:y-x=(m-n)p\\ 则可以通过x,y的差值找到公因子p, 对(y-x)分解因数即可, \\若找到任意的p, 该p对应的Lucky Chain的长度就是p-a\%p \\ 在预处理因子时, 可以使用线性筛, 只需记录每个数的一个因子\\ 可以发现, 只有一种情况下, Lucky Chain无限长, 即x+1=y时\\ \]

代码

#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#include <bits/stdc++.h>

using namespace std;

const int N = 1e7 + 7;

int fac[N], prime[N], cnt;
bool st[N];

int gcd(int x, int y) {
	return y == 0 ? x : gcd(y, x % y);
}

void solve() {
	int x, y;
	
	cin >> x >> y;
	
	if (y - x == 1) {
		cout << "-1\n";
		return;
	}
	if (gcd(x, y) != 1) {
		cout << "0\n";
		return;
	}
	
	int ans = 1e9, dif = y - x;
	
	while (dif > 1) {
		int p = fac[dif];
		
		dif /= p;
		
		ans = min(ans, p - x % p);
	}
	
	cout << ans << '\n';
}

signed main() {
	IOS;
	int T;
	cin >> T;
	
	for (int i = 2; i <= 10000000; ++i) {
		if (!st[i]) {
			prime[cnt ++] = i;
			fac[i] = i;
		}
		for (int j = 0; prime[j] <= 10000000 / i; ++j) {
			st[prime[j] * i] = 1;
			fac[prime[j] * i] = prime[j];
			if (i % prime[j] == 0) {
				break;
			}
		}
	}
	
	while (T--) {
		solve();
	}
	
	return 0;
}

标签:cout,Chain,数论,每日,Lucky,int,因子,一题
From: https://www.cnblogs.com/whose-dream/p/16979335.html

相关文章

  • 力扣每日一题2022.12.12---1832. 判断句子是否为全字母句
    全字母句指包含英语字母表中每个字母至少一次的句子。给你一个仅由小写英文字母组成的字符串sentence,请你判断 sentence是否为全字母句。如果是,返回true;否则,返回......
  • SQL计算每日累计
    假设现在有一张表usersidcreated_at12022-11-0515:05:02.10267422022-11-0507:50:34.75341632022-11-0608:36:11.61985642022-11-0721:08:16.......
  • 力扣每日一题2022.12.12---1781. 所有子字符串美丽值之和
    一个字符串的美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。   比方说,"abaacc" 的美丽值为 3-1=2 。给你一个字符串 s ,请你返回它所有......
  • 每日算法之把数组排成最小的数
    JZ45把数组排成最小的数描述输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3,32,321],则打印出这三......
  • 每日一抄 Go语言使用select切换协程
    看了两篇博客,一个说:在任何一个case中执行break或者return,select就结束了。另一个说:break只能跳出select中的一个case验证了一下,不知道对不对,感觉是跳出了整个selec......
  • 每日食词—day034
    expirev.到期、终止、过期、失效registern. v.注册账户、寄存器、登记pausen. v.暂停、暂停键、暂息、休止、停顿hierarchicaladj.分层、层次化、分级、......
  • 每日食词—day033
    generateviawizard通过向导生成viawizard:通过向导via等价于throughtranslationn.翻译、转换、平移、调换fontn.字体、字型subscriptionn. adj.订......
  • 新手算法第一题----删除排序数组中的重复项
     * @param {number[]} nums * @return {number} */var removeDuplicates = function(nums) {  if(nums == 0 || nums == [])    return 0......
  • 力扣每日一题2022.12.11---1827. 最少操作使数组递增
    给你一个整数数组 nums (下标从0开始)。每一次操作中,你可以选择数组中一个元素,并将它增加 1 。   比方说,如果 nums=[1,2,3] ,你可以选择增加 nums[1] 得到 n......
  • 每日算法之整数中1出现的次数(从1到n整数中1出现的次数)
    JZ43整数中1出现的次数(从1到n整数中1出现的次数)描述输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数例如,1~13中包含1的数字有1、10、11、12......