正题

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


题目大意

给出\(n\)求一个最小的\(x(x>0)\)满足

\[\left(\sum_{i=1}^xi\right)\equiv 0(\mod n)
\]

\(1\leq n\leq 10^{12},1\leq T\leq 100\)


解题思路

转成等比数列求和就是

\[\frac{i(i+1)}{2}\equiv 0(\mod n)\Rightarrow i(i+1)=2kn
\]

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

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

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

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

这样应该就能过了。


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

CometOJ-[Contest #10]鱼跃龙门【exgcd】的更多相关文章

  1. Comet OJ - Contest #10 鱼跃龙门 exgcd+推导

    考试的时候推出来了,但是忘了 $exgcd$ 咋求,成功爆蛋~ 这里给出一个求最小正整数解的模板: ll solve(ll A,ll B,ll C) { ll x,y,g,b,ans; gcd = e ...

  2. 2016 Multi-University Training Contest 10

    solved 7/11 2016 Multi-University Training Contest 10 题解链接 分类讨论 1001 Median(BH) 题意: 有长度为n排好序的序列,给两段子 ...

  3. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

  4. 2015 Multi-University Training Contest 10 hdu 5406 CRB and Apple

    CRB and Apple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  5. 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries

    CRB and Queries Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  6. [二分,multiset] 2019 Multi-University Training Contest 10 Welcome Party

    Welcome Party Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)T ...

  7. 2015 Multi-University Training Contest 10(9/11)

    2015 Multi-University Training Contest 10 5406 CRB and Apple 1.排序之后费用流 spfa用stack才能过 //#pragma GCC o ...

  8. Comet OJ - Contest #10 C.鱼跃龙门

    传送门 题意: 求最小的\(x\),满足\(\frac{x(x+1)}{2}\% n=0,n\leq 10^{12}\). 多组数据,\(T\leq 100\). 思路: 直接考虑模运算似乎涉及到二次 ...

  9. Comet OJ - Contest #10 C题 鱼跃龙门

    ###题目链接### 题目大意: 给你一个 x ,让你求出最小的正整数 n 使得 n * (n + 1) / 2  % x == 0 ,即 n * (n + 1)  % 2x == 0 . 分析: 1 ...

随机推荐

  1. Centos7上yum安装mongodb(安装epel中的版本可能会比较老)

    yum install epel-release 搜索mongodb-server 安装mongodb yum install mongodb-server.x86_64 配置mongodb vim ...

  2. exportfs命令 – 管理NFS服务器共享的文件系统

    exportfs命令需要参考配置文件"/etc/exportfs".也可以直接在命令行中指定要共享的NFS文件系统. 语法格式: export [参数] [目录] 常用参数: -a ...

  3. 【java虚拟机】类加载机制

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/6959615.html 一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中, ...

  4. 【转载】vim 中文帮助手册的安装

    本文出处http://hi.baidu.com/bkhcvzdvmjfkpyr/item/9c238224c1a69498b6326360 vim自带的帮助手册是英文的, 对平时编程的人来说没有多大阅 ...

  5. javacc在stanfordnlp中的应用

    总结: 这个javacc感觉比较复杂,在于stanfordnlp中 p.p1 { margin: 0; font: 11px Monaco } CoreMapExpressionExtractor这个 ...

  6. mzy git学习,禁用Fast forward的普通合并(六)

    git merge --no-ff -m "msg" x-branch:禁用Fast forward的普通合并 通常,合并分支时,如果可能,Git会用Fast forward模式, ...

  7. 寻找最短路径Dijkstra算法

    1 /** 2 * 1.对于T中的每个顶点u,找到u的具有最小权重的连接边.所有到u的连接边都存储在queues.get(u)中.queues.get(u).peek()返回拥有最小权值 3 * 的连 ...

  8. 刷题-力扣-1738. 找出第 K 大的异或坐标值

    1738. 找出第 K 大的异或坐标值 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-co ...

  9. golang中的三个点 ‘...‘ 的用法

    '-' 其实是go的一种语法糖. 它的第一个用法主要是用于函数有多个不定参数的情况,可以接受多个不确定数量的参数. 第二个用法是slice可以被打散进行传递. 下面直接上例子: func test1( ...

  10. Learning ROS: Using a C++ class in Python

    http://wiki.ros.org/ROS/Tutorials/Using%20a%20C%2B%2B%20class%20in%20Python This tutorial illustrate ...