比赛第一题,当然是水题啦 ,废话不多说让我们步入正题。
题目描述:
小PP超喜欢喝水,所以他就去买水了。
商店里有 5 种水
第 1 种:商店里有无数瓶
第 2 种:商店里只有一瓶
第 3 种:商店里竟然有 4 瓶 。
第 4 种: 5 瓶5 瓶一包卖的
第 5 种: 2 瓶 2 瓶一包卖的
好奇心极强的小PP想买 n 瓶水,他想知道他有多少种买法。
输入
输入文件 h2o.in 的第一行包括一个正整数N
输出
输出文件h2o.out 有且仅有一个整数 , 为买水方案数。
样例输入
1
样例输出
3
数据范围限制
对于 10% 的数据: n<=10;
有 20% 的数据: n<=100000;
对于 100% 的数据: n<=2147483647;
题目简介(不想看题目的过来啦):
五种方法让你凑出一个n,让你求方案数。
题目解法:
1.暴力,我们可以开一个5重循环去枚举,但显然这个方法只能过10%的数据。(但是我们考试的时候,一开始没想到别的好的方法,暴力枚举也有作用……)
2.数学解法
我们接上一句话,用暴力跑一遍:
得出:
n=1,ans=3;
n=2,ans=6;
n=3,ans=10;
n=4,ans=15;
n=5,ans=21……
这时,注意看ans。我们可以发现,他可以由等差数列得出——3=1+2,6=1+2+3,10=1+2+3+4……
那就可以快乐(快速)套用等差数列求和公式啦,直接输出(1+n)(n+2)/2就好啦!
代码部分:(自己去打啦,非常简单……只不过n要开longlong,输出longlong类型就好啦!)
#include<cstdio>
using namespace std;
long long n;
void putin()
{
scanf("%lld",&n);
}
int main()
{
freopen("h2o.in","r",stdin);
freopen("h2o.out","w",stdout);
putin();
printf("%lld",(1+n)*(2+n)/2);
return 0;
}
没得问题的水题,推导过程倒是有点绕 (是我自己没料到等差数列这一步,想了一会)……