hdu5207Greatest Greatest Common Divisor
题意
给定n个数求任意俩个数得最大公因数
思路
因为之前写过求俩个数得最小公倍数,所以这道问题迎刃而解,就是枚举他们得因数,用数组记录每个因数出现的次数,最后从大到小找出现俩次得那个数,输出即可。
代码1
1 |
|
但后来听大佬的正解,发现是先预处理出所有数的因数直接在循环中累计个数就🆗了。
代码2
1 |
|
HDU5698瞬间移动
题意
无限大的矩形,从(1,1)每次可以瞬移到右下方格的任意一个格子,求最后到达(n,m)的方案数。
思路
枚举中间走的步数i,中间走的最大步数必然是min(m-2,n-2)步,然后开始枚举。
代码1
1 |
|
网上查阅的答案为C(n+m-4,n-2)
代码2
1 |
|
cfdiv2 Modified GCD
题意
给定俩个数a和b,然后给m个查询,每行俩个整数x和y,表示查询x到y之间最大a和b的因数。
思路
这也太简单了,直接预处理出gcd(a,b)的所有因数,排序,二分查找第一个比b大的数的下标位置,在把这个位置向后倒退一步,再判断是否为x-y这个区间内,是则输出,否则输出-1.
代码
1 |
|
BZOJ2818 Gcd
题意
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.
思路
由题意得:
gcd(x,y)=p
gcd(x/p,y/p)=1
所以枚举每个素数(代码中m表示n以内的素数个数),求n/p以内俩俩互质对数的个数,最后再乘p即为所求的gcd(x,y)=p ,因为俩个数顺序变换也算,所以最后乘2,另外(1,1)是个特殊的存在所以在计算的时候减去最后再加即可。
代码
1 |
|
POJ1061青蛙的约会
题意
有俩个青蛙A和B,在一个长为l的环形上,初始时A在x处每次跳m米,B在y处每次跳n米,求最后需要跳几次才能相遇。
思路
很明显一个扩展欧几里得的模板题。
因为(x+mt)%l=(y+nt)%l,
移项得(m-n)t%l=(y-x)%l
得(m-n)t+lk=(y-x)
对应扩展欧几里得中(ax+by=c) , (m-n)为a,l为b ,c为(y-x).
最后求得得数为x得解,因为可能为负数所以最后((x*c/gcd(a,b)%l)+l)%l。
代码
1 |
|