首页 > 其他分享 >Lucky Chains

Lucky Chains

时间:2024-04-04 11:03:16浏览次数:30  
标签:约数 gcd int Lucky vis lst ans Chains

题目链接

Educational Codeforces Round 139 (Rated for Div. 2)

D. Lucky Chains

取模的性质,更相减损术


思路:

我们假设链的长度为 w w w,不妨设 x ≥ y x\ge y x≥y,那么 g c d ( x + k , y + k ) = 1 ( 0 ≤ k ≤ w ) gcd(x+k,y+k)=1\quad (0\le k\le w) gcd(x+k,y+k)=1(0≤k≤w)。根据更相减损术,可以把式子写成如下形式: g c d ( x + k , y + k ) = g c d ( y + k , x − y ) = 1 gcd(x+k,y+k)=gcd(y+k,x-y)=1 gcd(x+k,y+k)=gcd(y+k,x−y)=1我们只要找到第一个不满足这个式子的 k k k 的取值,我们就知道了链的长度 w w w。

如果 g c d ( y + k , x − y ) ≠ 1 gcd(y+k,x-y)\not=1 gcd(y+k,x−y)=1,那么假设它们的最大公因数为 p p p,即 g c d ( y + k , x − y ) = p gcd(y+k,x-y)=p gcd(y+k,x−y)=p 的话, y + k , x − y y+k,x-y y+k,x−y 都应该是 p p p 的倍数, p p p 是它们的约数。因为 x − y x-y x−y 是个定值,所以我们可以枚举 x − y x-y x−y 的所有约数来得到 p p p。

不过枚举约数太慢了, n ∗ 1 0 7 ≈ 3 ∗ 1 0 9 n*\sqrt{10^7}\approx3*10^9 n∗107 ​≈3∗109,取模运算还很慢,八成会超时。考虑到我们上面其实并不需要知道 y + k , x − y y+k,x-y y+k,x−y 的最大公因数,我们只要他俩随便能有个相同的因数就行了,因此我们可以把这个最大公因数 p p p 拆成若干质因数,我们只对质因数进行验证就好了。

将某个数分解质因数可以用欧拉筛来预处理,每次标记合数的时候就记录一下这个合数由哪个质数算过来即可。之后查询会非常迅速(有几个质因数就只查几遍)。

而 y + k y+k y+k 是 p p p 的倍数就需要 k = ( y − y % p ) % p k=(y-y\%p)\%p k=(y−y%p)%p( y y y 加上一个值得到最近的 p p p 的倍数)。 k k k 值就是所有约数中满足条件的最小的那个了。 0 ∼ k − 1 0\sim k-1 0∼k−1 都满足条件,链长就是 k k k 了。

code:

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1e7+5;
const int inf=1e9;

int T,a,b,x;

bool vis[maxn];
int prime[maxn],lst[maxn],cnt;
void Eular(int n){
	vis[1]=true;
	lst[1]=1;
	for(int i=2;i<=n;i++){
		if(!vis[i]){
			prime[++cnt]=i;
			lst[i]=i;
		}
		for(int j=1,p=prime[1];j<=cnt && i*p<=n;p=prime[++j]){
			vis[i*p]=true;
			lst[i*p]=p;
			if(i%p==0)break;
		}
	}
}

int main(){
	cin.tie(0)->sync_with_stdio(false);
	Eular(1e7);
	cin>>T;
	while(T--){
		cin>>a>>b;
		if(a>b)swap(a,b);
		x=b-a;
		
		int ans=inf;
		for(int p=lst[x];p!=1;p=lst[x/=p])
			ans=min(ans,(p-b%p)%p);
		if(ans!=inf)cout<<ans<<endl;
		else cout<<-1<<endl;
	}
	return 0;
}

标签:约数,gcd,int,Lucky,vis,lst,ans,Chains
From: https://blog.csdn.net/qq_45809243/article/details/137368685

相关文章

  • 挑战程序设计竞赛 2.6章习题 poj 3421 X-factor Chains
    https://vjudge.net/problem/POJ-3421#author=GPT_zhGivenapositiveintegerX,anX-factorchainoflengthmisasequenceofintegers,1=X0,X1,X2,…,Xm=XsatisfyingXi<Xi+1andXi|Xi+1wherea|bmeansaperfectlydividesintob.Nowwea......
  • 「CF1766D」 Lucky Chains
    题意给定\(T\)组整数\(x,y(1\lex,y\le10^7)\),求出整数\(k\),使得\((x,y),(x+1,y+1),\cdots,(x+k,y+k)\)互质,\((x+k+1,y+k+1)\)不互质,若\(k\)有无数解,输出-1,否则输出\(k\)的值。分析当\(y-x=1\)时,\(k\)有无数组解。因为\(\gcd(x+k,y+k)\ne1\),由小学奥数的“......
  • CF145C Lucky Subsequence 题解
    首先,我们对这个幸运数进行分析,发现:\(10^9\)以内只有\(1023\)个幸运数,即\(\sum\limits_{i=0}^92^i\)个。考虑对幸运数和非幸运数分类讨论。幸运数部分:01背包裸题,\(dp_{i,j}\)表示前\(i\)个幸运数里选了\(j\)个,转移方程为\(dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}\tim......
  • hdu 4460 Friend Chains (图最长路的最小值)
    Problem-4460(hdu.edu.cn)写完提交答案错了,后面发现vis初始化的地方错了,以前BFS都只调用一次,看来我中毒太深。这个题更能体现BFS的特性,增加dis数组记录距离。#include<iostream>#include<queue>#include<cstring>#include<vector>#include<map>usingnamespacestd;c......
  • CF145E Lucky Queries 题解
    题目链接:CF或者洛谷前置知识点:序列操作本文关键词约定俗称:因为频繁敲最长不下降子序列\(LNCS\)和最长不上升子序列\(LNIS\)太麻烦了,下文将\(000011111\)这种最长不降子序列用\(LIS\)描述,\(1111100000\)这种最长不升子序列用\(LDS\)描述。这里面只有\(4\)和\(7......
  • 解决每次启动wsl地址都会变化,导致proxychains4得手动替换ip地址的问题
    前言由于每次启动wsl的地址都会发生改变,使用proxychains4每次都得修改配置文件,因为我连的热点,所以本机ip地址也老是会变,如果是在校园网等ip地址不会频繁变化的网络环境下,可以直接使用本机ip地址解决方案让手动变自动了(bushi首先查看自己的/etc/proxychains4.conf,我的这个ip地......
  • CF121E Lucky Array
    题意给定一个序列,维护下列操作。区间加区间查询数中只包含\(4,7\)数的个数。所有数前后不超过\(1e4\)。Sol块块版。\(1e4\),发现满足条件的数的个数只有\(30\)个。对于每个块开一个桶,记录每种数有多少个。查询时暴力枚举\(30\)个数,暴力判断即可。修改是平凡的......
  • maven toolchains 简单说明
    很多时候我们项目可以会包含需要不同jdk构建,比如有些只能使用jdk8,有些需要使用jdk11,toolchains可以帮助我们解决此问题一般玩法创建一个toolchains.xml目录,放到home目录下,里边配置实际需要的jdk版本(我们的环境可以安装多jdk)项目构建的时候(使用的插件)使用配置的工具参考配置......
  • maven toolchains 简单说明
    很多时候我们项目可以会包含需要不同jdk构建,比如有些只能使用jdk8,有些需要使用jdk11,toolchains可以帮助我们解决此问题一般玩法创建一个toolchains.xml目录,放到home目录下,里边配置实际需要的jdk版本(我们的环境可以安装多jdk)项目构建的时候(使用的插件)使用配置的工具参考......
  • Lucky-Canvas抽奖插件的使用
    官方网站:https://100px.net/新建一个空白的js文件’lucky-canvas.js‘,复制官网的JS代码'https://unpkg.com/[email protected]/dist/index.umd.js'新建一个html网页'lucky-canvas.html',引入刚刚新建的js文件<!doctypehtml><html><head><metacharset="......