日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/3 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CometOJ-[Contest #10]鱼跃龙门【exgcd】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正題

題目鏈接:https://cometoj.com/problem/1479


題目大意

給出nnn求一個最小的x(x>0)x(x>0)x(x>0)滿足
(∑i=1xi)≡0(modn)\left(\sum_{i=1}^xi\right)\equiv 0(\mod n)(i=1x?i)0(modn)

1≤n≤1012,1≤T≤1001\leq n\leq 10^{12},1\leq T\leq 1001n1012,1T100


解題思路

轉(zhuǎn)成等比數(shù)列求和就是
i(i+1)2≡0(modn)?i(i+1)=2kn\frac{i(i+1)}{2}\equiv 0(\mod n)\Rightarrow i(i+1)=2kn2i(i+1)?0(modn)?i(i+1)=2kn

從里面獲得一下信息,考慮枚舉2n2n2n的所有約數(shù)ddd,那么我們有xd×y2nd=2knxd\times y\frac{2n}ozvdkddzhkzd=2knxd×yd2n?=2kn。

也就是設(shè)y2nd=xd+1y\frac{2n}ozvdkddzhkzd=xd+1yd2n?=xd+1,這個式子我們用exgcdexgcdexgcd求出最小解然后所有里面取最小的。

然后是一點優(yōu)化,首先暴力枚舉約數(shù)是O(n)O(\sqrt n)O(n?)的,我們可以質(zhì)因數(shù)分解之后搜索就是O(σ0(n))O(\sigma_0(n))O(σ0?(n))的了。

然后因為iii(i+1)(i+1)(i+1)一定互質(zhì),所以ddd2nd\frac{2n}ozvdkddzhkzdd2n?不能有相同的質(zhì)因子。

這樣應(yīng)該就能過了。


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; }

總結(jié)

以上是生活随笔為你收集整理的CometOJ-[Contest #10]鱼跃龙门【exgcd】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。