[gmoj 7177]鱼跃龙门

news/2024/10/15 13:53:31/

在这里插入图片描述
思路:
我们很容易想到,题目要我们求得答案为
( 1 + x ) x 2 % n = = 0 \frac{\left(1+x\right)x}2\%n==0 2(1+x)x%n==0
把除以2移项到右边
( 1 + x ) x % 2 n = = 0 (1+x)x\%2n==0 (1+x)x%2n==0
我们再回顾扩展欧几里得(exgcd)的柿子
a x + b y = g c d ( x , y ) ax+by=gcd(x,y) ax+by=gcd(x,y)
x + 1 = A s x+1=As x+1=As, x = B t x=Bt x=Bt,其中 A B = 2 n AB=2n AB=2n,那么 A s − B t = 1. As-Bt=1. AsBt=1.

从而得到一个做法,枚举所有可能的A,B的组合,
用exgcd求解最小正数x=Bt更新答案。

在这个题目中,若gcd(A,B)=1,我们求As+Bt=1的一组特解(s,t),从而令k=−t,(s,k)就是As−Bk=1的一组特解。我们要求x=Bk为最小正整数,而B是固定的正数,因而让k取最小正整数即可。显然地,若(s,k)是一组解,则u为整数时,(s+uB,k+uA)也是一组解。所以k<=0时取(k mod A ) +A,k>0时取(k mod A ) A即可。有些题目中gcd(A,B)!=1,此时用)A/gcd(A,B)和B/gcd(A,B)作为调整步长即可。

答案要求gcd(x,y)=1,就是x,y是互质的两个数,毕竟x,y是相邻的两个数。
考虑将2n质因数分解,分解出来的某一个质因数一定是全部属于x或y的。
否则两个数一定不是互质的。

#include <cstdio>
#include <iostream>
#define ll long long
//#pragma GCC optimize(2)
#define reg registerusing namespace std;const ll N = 1000000;ll T, n, p[N], ans, m, a[30], cnt;
bool S[N];void exgcd(ll a1, ll b1, ll &x, ll &y)
{if(!b1){x = 1, y = 0;return;}exgcd(b1, a1 % b1, x, y);ll t = x;x = y;y = t - a1 / b1 * y;
}void dfs(ll x, ll a1, ll b1)
{if(x > m){ll x1, y;exgcd(a1, b1, x1, y);y = -y;y %= a1;if(y <=0) y += a1;ans = min(ans, y * b1);return ;}dfs(x + 1, a1 * a[x], b1);dfs(x + 1, a1, b1 * a[x]);
}int main()
{for(reg ll i = 2; i <= N; i++){if(S[i]) continue;p[++cnt] = i;for(reg ll j = i + i; j <= N; j+=i)S[j] = 1;} scanf("%lld", &T);while(T--){scanf("%lld", &n);n *= 2;ans = n - 1;m = 0;for(reg ll i = 1; i <= cnt && p[i] <= n; i++){if(n % p[i] != 0) continue;a[++m] = 1;while(n % p[i] == 0) n /= p[i], a[m] *= p[i];}if(n > 1) a[++m] = n;dfs(1ll, 1ll, 1ll);printf("%lld\n", ans);}return 0;
}

http://www.ppmy.cn/news/450700.html

相关文章

链表的基本操作

链表的基本操作 链表的分类 单向/双向&#xff08;引入了 prev 引用&#xff09;带傀儡节点/不带傀儡节点&#xff08;dummy node&#xff09;带环/不带环 链表的遍历 遍历方式可利用 while 或者 for 循环来进行实现&#xff0c;主要代码块可展示为&#xff1a; //for循环…

链表:常见面试题-拷贝特殊链表

题目&#xff1a; 一种特殊的单链表节点类描述如下: class Node { int value; Node next; Node rand; Node(int val) {value val} } rand指针是单链表节点结构中新增的指针&#xff0c;rand可能指向链表中的任意一个节点&#xff08;包括自己&#xff09;&#xff0c;也可…

盐城市公交路线及时刻表

盐城B支1路公交车运营时间&#xff1a;6:00--20:30 单程票价&#xff1a;1元 途经道路&#xff1a;城西公交回车场-西环路-建军西路-太平路-大庆路-解放路-青年路-亭湖大道-生物工程学校城西公交回车场- 蟒蛇河大桥(北&#xff09; - 市一院 - 泰山庙 - 市房产交易市场 - 太平人…

哈希表--day2--(leetcode242/leetcode383/leetcode49/leetcode438)

文章目录 leetcode242.有效的字母异位词基本思路AC-code leetcode383. 赎金信基本思路AC-code leetcode49.字母异位词分组基本思路AC-code leetcode438.找到字符串中所有字母异位词基本思路AC-code leetcode242.有效的字母异位词 链接 基本思路 思路实际上很简单&#xff0c…

Java三大器小结

filter实例/filter实例/监听器实例过滤和拦截区别/Listener实例/Listener实例

Servlet 三大器

文章目录 脑图 英文博客

大器人生

大器人生 古希腊著名政治家伯利克里任雅典首席官时&#xff0c;由于进行了一系列改革&#xff0c;反对者甚众&#xff0c;有人当面辱骂&#xff0c;但他从不动怒。一天傍晚&#xff0c;一个市民还闯进伯利克里的屋子&#xff0c;一进门就对着他骂个不停。但伯利克里只是静静地坐…

python三大_Python之三大器

一、装饰器 闭包函数 闭&#xff1a;指的是定义在函数内部的函数 比如手机是闭包函数(内层函数)&#xff0c;被手机包装盒 (外层函数) 包裹起来&#xff0c; 手机可以使用包装盒中的东西&#xff0c;内层函数可以引用外层函数的名字。 闭包函数&#xff1a;定义在函数内部的函数…