CF1967B1 Reverse Card (Easy Version) 题解

CF1967B1 Reverse Card (Easy Version)

我们发现 \(b\times\gcd(a,b)\) 必然为 \(b\) 的倍数,那么 \(b\times\gcd(a,b)\) 的倍数 \(a+b\) 也必然为 \(b\) 的倍数。所以,\(a\) 必然为 \(b\) 的倍数。因为 \(a\)\(b\) 的倍数,所以 \(\gcd(a,b)=b\),原式可化为 \(a+b=xb^2\),其中 \(x\) 为正整数。

考虑枚举 \(b\),原式可化为 \(a=xb^2-b\)。又因为 \(a\le n\),则 \(xb^2-b\le n\)。则 \(x\) 的最大值为 \(\lfloor\frac{n+b}{b^2}\rfloor\),共有 \(\lfloor\frac{n+b}{b^2}\rfloor\) 种取值,对应的,\(a\) 也有 \(\lfloor\frac{n+b}{b^2}\rfloor\) 种取值。

注意最后有 \(a=1,b=1\) 这种情况会算重,需要减去 \(1\)

代码实现与讲解略微不同,但本质一样。

#include <bits/stdc++.h>
using namespace std;
long long t,n,m;
int main()
{
	scanf("%lld",&t);
	while(t--)
	   {
	   	long long ans=0;
	   	scanf("%lld%lld",&n,&m);
	   	for(int i=1;i<=m;i++)
	   	    {
	   	    if(n<(i-1)*i)break;
		    ans=ans+(n-(i-1)*i)/(i*i)+1;
		    }
	   	printf("%lld\n",ans-1);
	   }
	return 0;
} 
posted @ 2025-02-16 22:32  w9095  阅读(11)  评论(0)    收藏  举报