1 条题解
-
0
自动搬运
来自洛谷,原作者为

佑月之星
**搬运于
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
- 上传者