首页 > 其他分享 >修塔(gcd+裴蜀定理)

修塔(gcd+裴蜀定理)

时间:2024-02-03 09:33:43浏览次数:27  
标签:gcd int james 整数 2a 修塔 裴蜀

第3题     修塔 查看测评数据信息

有编号1~n 的n个塔,除了两个塔a和b 是好的不用修以外,其他都需要重修。

james和jordan展开修塔比赛,规则是轮流修,每次可以修第j+k或j-k号塔,其中j和k是已经修好的任意两个塔,

如果不能修塔,就输了。给出n,a,b,从 james开始,问最后谁赢了。

 

输入格式

 

第一行,一个整数T, 1<=T<=10000,表示有T组测试数据。

接下来T行,每行3个整数: n,a,b。2<a,b,n≤200000。a!=b。

 

 

 

 

输出格式

 

共T行,每行一个字符串。

 

 

输入/输出例子1

输入:

1

5 2 3

 

输出:

james

 

 

样例解释

 

问题分析:

分析一下,第一轮可能是a-b,a+b,b-a,b+a

第二轮可能是a-2b,2a-b,2a+b,2b+a,b-2a,2b-a,等等等等

我们发现这些数都是由 xa+yb组合而来的,很像线性组合,其中x,y为整数

考虑几个线性组合相加,ax1+by1+ax2+by2=a(x1+x2)+b(y2+y1),2个整数相加的结果也是整数

有可能得出7a+3b吗?可以的,比如a+a+...+a+b+b+b,7a-3b也都可以取到

但是1<= 7a+3b <=n 才可以取到。我们举例,4x+6y,结果一定是gcd(4,6)的倍数

一共有n/gcd(a,b)个塔,根据上面举例推广而来,这样就只要判断塔的奇偶性即可求出答案

如果能算出所有能修的塔的数量P,然后判断P的奇偶,若P为奇数,就是先手 james赢,P为偶数就是后手jordan赢。

可以试试暴力计算P。先预处理出a、b、a+b、a-b、2a+b、2a-b等,即可以修的塔的编号a和b的线性组合,即ax+by,再判断这些塔号是否合法,判断时需要枚举工和y,复杂度为O(n^2)。(也可以用宽搜)

下面用数论的办法直接得到P。根据裴蜀定理,ax + by是gcd(a,b)的整数倍,也就是说,P是所有gcd(a,b)的倍数的个数,则P = n/gcd(a,b)。

 

以下是参考程序:

 

#include <bits/stdc++.h>
using namespace std;

int t, n, a, b;
int gcd(int a, int b)
{
	if (b==0) return a;
	return gcd(b, a%b);
}
int main()
{
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d%d%d", &n, &a, &b);
		if ((n/gcd(a, b))%2==0) printf("jordan\n");
		else printf("james\n");
	}
	return 0;
}

 

 

 

标签:gcd,int,james,整数,2a,修塔,裴蜀
From: https://www.cnblogs.com/didiao233/p/18004352

相关文章

  • 伪随机数(gcd+裴蜀定理)
    第2题   伪随机数查看测评数据信息一个生成伪随机数的函数,seed(a+1)=[seed(a)+STEP]%MOD,为了能产生0~MOD-1的所有数,需要设定合适的STEP和MOD。例如,STEP=3,MOD=5,产生0,3,1,4,2,这是正确的设定;若STEP=15,MOD=20,只能产生0,15,10,5,这是错误的设定。 输入格式 ......
  • 数论-裴蜀定理
    原文 如果a与b均为整数,则存在整数x和y满足ax+by=(a,b)。由定理6容易证明正确性。 下面用扩展欧几里得算法(exgcd)求出满足ax+by=(a,b)的一个特解。例如:a=99,b=78,令d=(a,b)=(99,78)=3,求99x+78y=3的一个特解。在调用exgcd的时候,从后往前依次构造......
  • gcd & exgcd
    gcd&exgcdgcd设\(a=bk+c\),显然有\(c=a\bmodb\)。设\(d\mida,~d\midb\),则\(c=a-bk,\frac{c}{d}=\frac{a}{d}-\frac{b}{d}k\)。由右边的式子可知\(\frac{c}{d}\)为整数,即\(d\midc\),所以对于\(a,b\)的公约数,它也会是\(b,a\bmodb\)的公约数。反过来也需要证......
  • 欧拉函数——gcd问题的一大利器
    定义欧拉函数,即\(\varphi(n)\),表示的是\([1,n]\)内与\(n\)互质的数的个数,如\(\varphi(1)=1\)。若\(n\)是质数,显然\(\varphi(n)=n-1\)。性质欧拉函数是积性函数。若\(\gcd(a,b)=1\),则\(\varphi(a\timesb)=\varphi(a)\times\varphi(b)\)。更特殊......
  • UOJ #33 树上 GCD
    套路地,对每个\(g\in[1,n-1]\)求出有多少对无序对\((u,v)\)满足\(g|f(u,v)\),然后就可以用一个倒序枚举的\(\mathcalO(n\logn)\)的容斥求出答案。考虑点分治,对每个经过分治中心\(c\)的\(u\rightsquigarrow\text{lca}(u,v)\rightsquigarrowv\)只需分两种......
  • CF1174E Ehab and the Expected GCD Problem
    EhabandtheExpectedGCDProblemLuoguCF1174E题目描述\(p\)是一个排列,定义\(f(p)\):设\(g_i\)为\(p_1,p_2,\cdots,p_i\)的最大公因数(即前缀最大公因数),则\(f(p)\)为\(g_1,g_2,\cdots,g_n\)中不同的数的个数。设\(f_{max}(n)\)为\(1,2,\cdots,n\)的所有排......
  • exgcd+乘法逆元相关笔记
    #include<iostream>#include<cstdio>usingnamespacestd;constintpass=0;//exgcd://求解二元一次不定方程//ax+by=(a,b)=(b,a%b)=bx'+(a%b)*y'=bx'+(a-b*(a/b))*y'=b*(x'-(a/b)*y')+ay'//则有y=(x'-(a/b)*y'),x=y'......
  • E - Ring MST(n个数裴蜀定理)
    E-RingMST有i种操作,第i种操作为选择一个数x,然后在x和(x+a[i])%N之间连边,代价为c[i],问是否能够让图联通,如果可以最小生成树的边权和是多少。首先按照克鲁斯卡尔算法,我们肯定是按照边权从小到大连。考虑前i种操作都操作完后的连通块个数。若u,v在同一联通块,则\(u\equivv+a......
  • 裴蜀定理
    定义设\(a,b\)是不全为\(0\)的整数1.对任意整数\(x,y\),满足\(\gcd(a,b)|ax+by\)2.存在整数\(x,y\)使得\(ax+by=\gcd(a,b)\)证明第一条理解一下即可,比较好理解第二条若任何一个等于\(0\),则\(\gcd(a,b)=a\),这时定理显然成立若\(a,b\)均不等于\(0\)由于......
  • CF1806F GCD Master 题解
    题目链接EasyversionHardversion题目解法参考DeaphetS的题解很有意思的题,感觉\(F1\)不到\(*2900\),\(F2\)超过\(*2900\)F1简化题目中的操作:把\(n\)个数放到\(n-k\)组中,求\(\max(\sum\)每组\(a_i\)的\(\gcd)\)首先考虑所有数互不相同的情况结论1:把\(k+......