「FJOI2007」轮状病毒

数数题怎么这么讨厌呀QwQ…

传送门

洛谷P2144

BZOJ1002

题解

这种数数题当然要先找规律呀poi!

通过手玩或者暴力,可以得到以下表格:

n ans
1 1
2 5
3 16
4 45
5 121
6 320

咦?当$n$为奇数时,$ans$都是完全平方数哇!!!

那么当$n$为偶数时呢?

哟,$ans$加上4之后也都是完全平方数呢!!!

把这些完全平方数开个方试试看!!!

就得到了这样的一个序列:1 3 4 7 11 18…

呀呀呀!这不就是一个变形的斐波那契数列么?

并且$n​$很小,直接上高精度就好了呢poi。

然后这题就做完了QwQ…

别问我为什么有这样的规律,我也不知道QwQ…

码完代码测样例,才发现高精度都写挂了,我好菜啊QwQ

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=105;
int n;
struct BigInt //封装好的高精度
{
int a[50],len;
BigInt(){len=0;memset(a,0,sizeof(a));}
BigInt(int x)
{
len=0;memset(a,0,sizeof(a));
while(x){len++;a[len]=x%10;x/=10;}
}
BigInt operator + (const BigInt& b)
{
BigInt c;
c.len=max(len,b.len);
for(int i=1;i<=c.len;i++)
{
c.a[i]+=a[i]+b.a[i];
c.a[i+1]+=c.a[i]/10;
c.a[i]%=10;
}
if(c.a[c.len+1]) c.len++;
return c;
}
BigInt operator * (const BigInt& b)
{
BigInt c;
c.len=len+b.len-1;
for(int i=1;i<=len;i++)
{
for(int j=1;j<=b.len;j++)
{
c.a[i+j-1]+=a[i]*b.a[j];
c.a[i+j]+=c.a[i+j-1]/10;
c.a[i+j-1]%=10;
}
}
if(c.a[c.len+1]) c.len++;
return c;
}
BigInt operator - (const int& b) //这个减法只能减去10以内的数
{
BigInt c=*this;
c.a[1]-=b;
for(int i=1;i<=c.len&&c.a[i]<0;i++)
{
c.a[i]+=10;
c.a[i+1]--;
}
while(!c.a[c.len]) c.len--;
return c;
}
inline void Print()
{
for(int i=len;i;i--) printf("%d",a[i]);
printf("\n");
}
}F[maxn],ans;
int main()
{
scanf("%d",&n);F[1]=1;F[2]=3;
for(int i=3;i<=n;i++) F[i]=F[i-1]+F[i-2];
ans=F[n]*F[n];
if(n%2==0) ans=ans-4; //n为偶数时记得减去4哟
ans.Print();
return 0;
}