专栏文章

题解:CF599D Spongebob and Squares

CF599D题解参与者 2已保存评论 1

文章操作

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

当前评论
1 条
当前快照
1 份
快照标识符
@mioebk5v
此快照首次捕获于
2025/12/02 17:48
3 个月前
此快照最后确认于
2025/12/02 17:48
3 个月前
查看原文

推推乐

对于 x×yx \times y 的表格,显然如果 x×yx \times y 成立,那么 y×xy \times x 也成立,于是我们假设 xyx \leq y
对于 i×ii \times i 的正方形,方案数为 (xi+1)(yi+1)(x-i+1)(y-i+1),所以总方案为 i=1x(xi+1)(yi+1)\sum\limits_{i=1}^{x}(x-i+1)(y-i+1)
如果 ii 表示能放下多少个正方形,那么上式也等价于 i=1xi(yx+i)\sum\limits_{i=1}^{x}i\cdot(y-x+i),两种表示都行(这种更好化简但难想一点)。
这个式子显然可以将求和化掉:x(x+1)(yx)2+x(x+1)(2x+1)6\frac{x(x+1)(y-x)}{2}+\frac{x(x+1)(2x+1)}{6}
通分:x(x+1)(2x+1)+3x(x+1)(yx)6\frac{x(x+1)(2x+1)+3x(x+1)(y-x)}{6}
合并:x(x+1)(3yx+1)6\frac{x(x+1)(3y-x+1)}{6}
化简到这里可以发现,两项最少要到 10610^6,如果枚举 xxyy 会爆,只能枚举 xx,所以我们要变换这个式子将 yy 表示出来。
设总方案为 tt 实际上就是输入但我懒得改了
t=x(x+1)(3yx+1)6t=\frac{x(x+1)(3y-x+1)}{6}
6t=x(x+1)(3yx+1)6t=x(x+1)(3y-x+1)
提出 yy
6t=3yx(x+1)+x(x+1)(x+1)6t=3yx(x+1)+x(x+1)(-x+1)
移项:
3yx(x+1)=6tx(x+1)(x+1)3yx(x+1)=6t-x(x+1)(-x+1)
系数化一:
y=6tx(x+1)(x+1)3x(x+1)y=\frac{6t-x(x+1)(-x+1)}{3x(x+1)}
这里就可以算了,我再化简分子:y=6t+x3x3x(x+1)y=\frac{6t+x^3-x}{3x(x+1)}
于是我们终于推出……接下来枚举 xx 看是否存在整数的合法 yy 就行了。

Code

CPP
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
#define F(i,x,y) for(i=x;i<=y;i++)
#define rF(i,x,y) for(i=x;i>=y;i--)
int x,y;
pair<int,int> ans[1000005];
signed main()
{
	int i,sum=0,cnt=0;
	cin>>x;
	F(i,1,2000000)
	{
		if(i>x) break;
		y=(6*x+i*i*i-i)/3/(i*i+i);
		if((6*x+i*i*i-i)%(3*(i*i+i))!=0||y<i) continue;
		ans[++cnt]={i,y},sum+=(i==y);
	}
	cout<<cnt*2-sum<<endl;
	F(i,1,cnt) cout<<ans[i].first<<' '<<ans[i].second<<endl;
	rF(i,cnt,1) if(ans[i].first!=ans[i].second)cout<<ans[i].second<<' '<<ans[i].first<<endl;
	return 0;
}

评论

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

正在加载评论...