1 条题解

  • 0
    @ 2026-3-26 18:43:46

    思路

    x,y1012x,y\leq10^{12},很显然暴力是不行的 (废话)。仔细思考会发现,如果知道aa就可以用O(1)O(1)计算出当XX最小时bb的值,于是只需要枚举aa即可,代码见下:

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    signed main()
    {
    	int n,m;scanf("%lld%lld",&n,&m);
    	int ans=1ll<<60;
    	for(int i=1;i*i<=m;i++)
    	{
    		int j=m/i+(m%i!=0);
    		if(i<=n&&j<=n)ans=min(ans,i*j);
    	}
    	if(ans==1ll<<60){puts("-1");return 0;}
    	printf("%lld\n",ans);
    	return 0;
    }
    

    但,事情会这么简单就结束吗?给你组数据: 4 15 按常理来讲会输出1616,但你惊奇的发现代码输出1-1这究竟是人性的扭曲还是道德的沦丧

    为什么呢?

    注意到在第88ii只会循环到33而非44,所以要扩大一点搜寻范围,代码如下(这回担保可以AC了):

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    signed main()
    {
    	int n,m;scanf("%lld%lld",&n,&m);
    	int ans=1ll<<60;
    	for(int i=1;i*i<=m*2;i++)
    	{
    		int j=m/i+(m%i!=0);
    		if(i<=n&&j<=n)ans=min(ans,i*j);
    	}
    	if(ans==1ll<<60){puts("-1");return 0;}
    	printf("%lld\n",ans);
    	return 0;
    }
    

    题解参考lottle1212的题解

    • 1

    信息

    ID
    1189
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    4
    已通过
    3
    上传者