CF1967B1 Reverse Card (Easy Version) 题解

CF1967B1 Reverse Card (Easy Version)

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

考虑枚举 b,原式可化为 a=xb2b。又因为 an,则 xb2bn。则 x 的最大值为 n+bb2,共有 n+bb2 种取值,对应的,a 也有 n+bb2 种取值。

注意最后有 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 @   w9095  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示