专栏文章
题解:CF599D Spongebob and Squares
CF599D题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mioebk5v
- 此快照首次捕获于
- 2025/12/02 17:48 3 个月前
- 此快照最后确认于
- 2025/12/02 17:48 3 个月前
推推乐
对于 的表格,显然如果 成立,那么 也成立,于是我们假设 。
对于 的正方形,方案数为 ,所以总方案为 。
如果 表示能放下多少个正方形,那么上式也等价于 ,两种表示都行(这种更好化简但难想一点)。
这个式子显然可以将求和化掉:
通分:
合并:
化简到这里可以发现,两项最少要到 ,如果枚举 和 会爆,只能枚举 ,所以我们要变换这个式子将 表示出来。
设总方案为 实际上就是输入但我懒得改了。
提出 :
移项:
系数化一:
。
这里就可以算了,我再化简分子:。
于是我们终于推出……接下来枚举 看是否存在整数的合法 就行了。
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 条评论,欢迎与作者交流。
正在加载评论...