1 条题解

  • 0
    @ 2025-8-24 21:53:59

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 佑月之星
    **

    搬运于2025-08-24 21:53:59,当前版本为作者最后更新于2019-08-03 16:01:28,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    咳咳,某蒟蒻第二次发题解

    第一次看这题内心OS:

    哇哦,好水哦 又能混一道黄题了

    于是噼里啪啦三重循环

    然后 原地 爆炸

    深思熟虑后改了双重循环

    照样爆炸

    仔细看了看题:10^9

    当场吐血身亡

    (一开始看成109)

    被老师要求拿出纸和笔

    开始写:

    a是第一个数,b是最后一个数,len为长度

    (a+b)* len / 2 = m (公式)

    然鹅介里有两个变量,就意味着要两重循环

    所以开始启动我们的 数 学 模 式

    (咳咳,敲黑板)

    因为len=b-a+1
    所以b=len+a-1
    那么式子就变成了(a+a+len-1)*len/2=m
    然后移项 2a+len-1=2m/len
    2a=2m/len-len+1
    a=(2m/len-len+1)/2
    

    那么,我们只要枚举len就好啦ヾ(◍°∇°◍)ノ゙

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int m,n;
    int main()
    {
    	cin>>n>>m;
    	for(int i=n;i>=1;i--)
    	{
        	        //当式子中的数不是整数或超出范围,就continue掉
    		if((2*m)%i!=0)continue;
    		if(((2*m/i)-i+1)%2!=0)continue;//不是整数
            
    		int a=((2*m/i)-i+1)/2;
            
    		if(a<1)continue;
    		if(a+i-1>n)continue;//超出范围
    		cout<<"["<<a<<","<<a+i-1<<"]"<<endl;
    	}	
    	return 0;	
    }
    

    兴高采烈的交上去(ノ゚▽゚)ノ

    三个点TLE !!!∑(゚Д゚ノ)ノ

    _(:ι」∠)_心态爆炸

    只好去问大佬

    得出:查找范围应该在 2m½ 范围内(根号打不出来QAQ随意吧)

    最终代码 :


    ↑↑↑ i=n改成i=sqrt(2*m)就好了

    (你以为我会给你直接抄的机会吗哈哈哈不可能的)

    (o°ω°o)管理员大大求过

    • 1

    信息

    ID
    2867
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者