专栏文章

题解:AT_abc420_g [ABC420G] sqrt(n²+n+X)

AT_abc420_g题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio58t8t
此快照首次捕获于
2025/12/02 13:34
3 个月前
此快照最后确认于
2025/12/02 13:34
3 个月前
查看原文
q1uple 随手切了,膜拜。

推式子:
m=n2+n+xm=\sqrt{n^2+n+x}
去根号:
m2=n2+n+xm^2=n^2+n+x
(2m)2=(2n)2+4n+4x(2m)^2=(2n)^2+4n+4x
(2m)2=(2n+1)2+4x1(2m)^2=(2n+1)^2+4x-1
(2m)2(2n+1)2=4x1(2m)^2-(2n+1)^2=4x-1
把左边写成 (a+b)(ab)(a+b)(a-b) 的形式:
(2m+2n+1)(2m2n1)=4x1(2m+2n+1)(2m-2n-1)=4x-1
考虑把 4x14x-1 拆成 a×ba\times b,使得存在非负整数 mm、整数 nn 满足:
2m+2n+1=a \\ 2m-2n-1=b \end{matrix}\right.$$ 枚举 $a,b$ 仅需 $\sqrt X$ 的时间复杂度。注意判重。 ```cpp #include<bits/stdc++.h> #define int long long #define mp(a,b) make_pair(a,b) using namespace std; inline int read(){ int a=0,b=1; char c=getchar(); while(!isdigit(c)){ if(c=='-') b=-1; c=getchar(); } while(isdigit(c)){ a=(a<<1)+(a<<3)+(c-'0'); c=getchar(); } return a*b; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>=10) write(x/10); putchar(x%10+48); } inline void write1(int x){ write(x),putchar(' '); } inline void write2(int x){ write(x),putchar('\n'); } vector<int> include13; signed main(){ int n=read()*4-1; for(int i=-2e7;i<=2e7;i++){ if(i==0) continue; int a=i,b=n/i; if(a*b==n){ if((a-b-2)%4==0){ include13.push_back((a-b-2)/4); } } } sort(include13.begin(),include13.end()); int include13_fAKe=0; for(int i=1;i<include13.size();i++){ if(include13[i]!=include13[i-1]) include13_fAKe++; } write2(include13_fAKe+1); write1(include13[0]); for(int i=1;i<include13.size();i++){ if(include13[i]!=include13[i-1]) write1(include13[i]); } putchar('\n'); return 0; }//ABC420G 一定要挽回罗琪钧的遗憾啊,一定会挽回罗琪钧的遗憾的! ```

评论

0 条评论,欢迎与作者交流。

正在加载评论...