CometOJ-[Contest #10]鱼跃龙门【exgcd】

news/2024/11/15 8:15:18/

正题

题目链接:https://cometoj.com/problem/1479


题目大意

给出 n n n求一个最小的 x ( x > 0 ) x(x>0) x(x>0)满足
( ∑ i = 1 x i ) ≡ 0 ( m o d n ) \left(\sum_{i=1}^xi\right)\equiv 0(\mod n) (i=1xi)0(modn)

1 ≤ n ≤ 1 0 12 , 1 ≤ T ≤ 100 1\leq n\leq 10^{12},1\leq T\leq 100 1n1012,1T100


解题思路

转成等比数列求和就是
i ( i + 1 ) 2 ≡ 0 ( m o d n ) ⇒ i ( i + 1 ) = 2 k n \frac{i(i+1)}{2}\equiv 0(\mod n)\Rightarrow i(i+1)=2kn 2i(i+1)0(modn)i(i+1)=2kn

从里面获得一下信息,考虑枚举 2 n 2n 2n的所有约数 d d d,那么我们有 x d × y 2 n d = 2 k n xd\times y\frac{2n}{d}=2kn xd×yd2n=2kn

也就是设 y 2 n d = x d + 1 y\frac{2n}{d}=xd+1 yd2n=xd+1,这个式子我们用 e x g c d exgcd exgcd求出最小解然后所有里面取最小的。

然后是一点优化,首先暴力枚举约数是 O ( n ) O(\sqrt n) O(n )的,我们可以质因数分解之后搜索就是 O ( σ 0 ( n ) ) O(\sigma_0(n)) O(σ0(n))的了。

然后因为 i i i ( i + 1 ) (i+1) (i+1)一定互质,所以 d d d 2 n d \frac{2n}{d} d2n不能有相同的质因子。

这样应该就能过了。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e6+10;
ll T,n,ans,cnt,tot,pri[N/10],p[30];
bool v[N];
void Prime(){for(ll i=2;i<N;i++){if(!v[i])pri[++cnt]=i;for(ll j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;}}return;
}
ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll d=exgcd(b,a%b,x,y);ll z=y;y=x-(a/b)*y;x=z;return d;
}
void solve(ll x,ll f){if(x>tot){if(f==1||f==n)return;ll a=n/f,b=f,X,Y;ll d=exgcd(a,b,X,Y);Y=-Y;if(X<0){Y+=((-X+b-1)/b)*a;X+=((-X+b-1)/b)*b;}if(X>0){Y-=(X/b)*a;X-=(X/b)*b;}if(Y<0){X+=((-Y+a-1)/a)*b;Y+=((-Y+a-1)/a)*a;}ans=min(ans,min(X*a,Y*b));return;}solve(x+1,f);solve(x+1,f*p[x]);return;
}
signed main()
{Prime();scanf("%lld",&T);while(T--){scanf("%lld",&n);tot=0;n=n*2;ll x=n;ans=n-1;for(ll i=1;i<=cnt;i++){if(x%pri[i]==0){p[++tot]=1;while(x%pri[i]==0)p[tot]*=pri[i],x/=pri[i];}}if(x!=1){p[++tot]=x;}solve(1,1);printf("%lld\n",ans);}return 0;
}

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

相关文章

【gmoj】 【扩欧】 鱼跃龙门

【gmoj】 【扩欧】 鱼跃龙门 题目 解题思路 题意 就是求1~x的和能整除n 高斯求和公式是x&#xff08;x1&#xff09;/2 也就是说x&#xff08;x1&#xff09;/2n 移项x(x1)2n 设apx1&#xff0c;bqx ap-bqgcd(a,b) 要求出最小的bq&#xff08;x&#xff09; 已知b&#xff0…

JDK 内置图形界面工具:海阔凭鱼跃,天高任鸟飞

GUI 图形界面工具,主要是 3 款:JConsole、JVisualVM、JMC。其实这三个产品可以说是 3 代不同的 JVM 分析工具。 这三个工具都支持我们分析本地 JVM 进程,或者通过 JMX 等方式连接到远程 JVM 进程。当然,图形界面工具的版本号和目标 JVM 不能差别太大,否则可能会报错。 下…

【毕业季】致毕业生的一句话:天高任鸟飞,海阔凭鱼跃

活动地址&#xff1a;毕业季进击的技术er 各位小伙伴们大家好&#xff0c;我是小曾哥&#xff0c;今天文章的主题没有技术干货&#xff0c;只有一个在校生的故事。 欢迎大家在评论区说出自己的故事&#xff0c;我先给大家抛个砖&#xff0c;希望能够引出大家的故事&#xff01;…

海阔凭鱼跃天高任鸟飞

独角兽 独角兽 独角兽 WWW.CUME.CC

鱼跃龙门——扩展欧几里得与唯一分解定理的巧妙运用

题目描述 给定一个正整数 n n n&#xff0c;一共有 n n n 座龙门&#xff0c;跳过第 j ( j < n ) j (j < n) j(j<n) 座龙门将会到达第 j 1 j1 j1 座龙门前&#xff0c;特殊地&#xff0c;跳过第 n n n 座龙门后将会到达第 1 1 1 座龙门前。 胖头鱼一开始在第一…

GMOJ7177 鱼跃龙门题解

GMOJ 7177 鱼跃龙门 题解 题面 显然是求最小的x 使得 x ( x 1 ) 2 ≡ 0 ( m o d n ) \frac{x \times(x 1)}{2} \equiv 0 (mod\; n) 2x(x1)​≡0(modn) 即 x ( x 1 ) ≡ 0 ( m o d 2 n ) x \times (x 1) \equiv0(mod\;2n) x(x1)≡0(mod2n) 令 d g c d ( x , 2 n ) , x …

CometOJ10C 鱼跃龙门

题目链接 problem 实际上就是对于给定的\(n\)求一个最小的\(x\)满足\(\frac{x(x1)}{2}kn(k\in N^*)\)。 solution 对上面的式子稍微变形可得\(x(x1)2kn\)。因为\(x\)与\((x1)\)互质&#xff0c;所以将\(n\)质因数分解后&#xff0c;同种质因子肯定都位于\(x\)或\((x1)\)中。\(1…

JZOJ7177-鱼跃龙门

Description&Data Constraint 1 ≤ T ≤ 100 , 1 ≤ n ≤ 1 0 12 1\le T\le100,1\le n \le 10^{12} 1≤T≤100,1≤n≤1012 Solution 简单来说&#xff0c;就是求满足 x ( x 1 ) 2 % n 0 \dfrac{x(x1)}{2}\%n0 2x(x1)​%n0 的最小的 x x x 。 推导一下&#xff1a; n…