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

LLqm_rYZ
**搬运于
2025-08-24 22:03:19,当前版本为作者最后更新于2020-10-23 13:17:47,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
P4759
最良心大致题意
大致题意就是给定一个正整数n,求一个公差为1和为n的等差数列。
分析
这一道题我们可以用枚举来做。那么重点来了--枚举的量为什么呢?
我们在讨论这个问题前先要了解一个等差数列求和公式:数列和=(首项+末项)×项数/2
那么有了这个公式,数列和已知,那么未知的项数和首项我们要枚举的量为-----项数,因为首项和末项要用到公差(已知为1)和项数来得出
推公式
在原公式中有两个未知量,但我们知道公差为1,所以可以把其中一个未知量--末项表示为首相+项数-1,公式可以表示为和=(首项+首项+项数-1)×项数/2
两边同时×2:和×2=(首项+首项+项数-1)×项数
两边同时/项数:和×2/项数=首项+首项+项数-1
两边同时+1:和×2/项数+1=首项+首项+项数
两边同时-项数:和×2/项数-项数+1=首项×2
枚举项数我们就可以得到首项,然后你会发现:
这不就是我们要的么
代码
这是
你们最喜欢的带注释的 Code :#include<bits/stdc++.h> using namespace std; int n,t;//声明 int main() { scanf("%d",&t); while(t--) {//t组数据 scanf("%d",&n); n*=2;//先将和*2便于处理和判断 bool iss=0;//用来判断是否有解 for (int i=2; i*i<=n; i++) {//枚举项数 if(n%i!=0) continue;//只需要用和*2去除以项数即可判断合法 int x=(n/i-i+1)/2,y=x+i-1;//左右端点 if ((n/i-i+1)%2==0) {//判断首项是否为整数,也就是首项*2是否为偶数 printf("%d = %d",n/2,x);//先输出总和and首项 iss=true;//记录iss为真也就是有解 for(int l=x+1; l<=y; l++) cout<<" + "<<l;//从tmp+1输出数列因为左端点在15行输出过了 break;//跳出循环节省时间 } } if(!iss)/*如果iss=false也就是无解*/ printf("IMPOSSIBLE"); printf("\n"); //换行 } return 0; }最后是
为了方便同学们复制的 Code :#include<bits/stdc++.h> using namespace std; int n,t; int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); n*=2; bool iss=0; for (int i=2; i*i<=n; i++) { if(n%i!=0) continue; int x=(n/i-i+1)/2,y=x+i-1; if ((n/i-i+1)%2==0) { printf("%d = %d",n/2,x); iss=true; for(int l=x+1; l<=y; l++) cout<<" + "<<l; break; } } if(!iss) printf("FANGCHAOXI"); printf("\n"); } return 0; }完(dian)结(ge)撒(zan)花(ba)~~
欢迎来我的博客看看
- 1
信息
- ID
- 3749
- 时间
- 2000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者