题解:P10788 [NOI2024] 分数
Larunatrecy · · 题解
首先假设
- 初始时
(p,q)=(1,0) 。 - 枚举
u=2k(k\geq 1) ,令(p,q)\to (q+up,p) 。
可以证明,该过程可以不重不漏生成所有
对于
考虑该过程中的所有
具体来说,搜索过程分成两部分,
算答案就是
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n,m;
LL res=0;
int cl(int a,int b){return b==0?1e9:a/b;}
void dfs(int a,int b,int c,int d,int v)
{
res+=max(0,min(cl(n-a,b),cl(n-c,d))-v+1);
res+=min(cl(m-a,b),cl(n-c,d))-v+1;
for(int u=1;;u++)
{
if(c+2*a*u+(d+2*b*u)*max(v,u)>m||a+b*max(v,u)>n)break;
dfs(c+2*a*u,d+2*b*u,a,b,max(u,v));
}
}
void dfs1(int x,int y,int v)
{
for(int u=1;;u++)
{
if(x+2*max(u+1,v)*(y+2*u*x)>m||y+2*u*x>n)break;
dfs1(y+2*u*x,x,max(v,u+1));
}
dfs(y,2*x,x,0,v);
}
int main()
{
cin>>n>>m;
if(n>m)swap(n,m);
dfs1(1,0,1);
cout<<res;
return 0;
}