关闭

1049. Mondriaan

398人阅读 评论(0) 收藏 举报
分类:

直接上递推公式 f[i]=3*f[i-1]+f[i-2]-f[1-3] (i>=3)

通项公式为 f[i]=2*(f[0]+f[1]+...+f[n-3])+3*f[n-2]+2*f[n-1]

 

长度为1的区间内可能有2种情况,即两个正方形或一个长方形

长度为2的区间内去掉长度为1的区间中的情况有3种情况,即上面两个正方形,下面一个长方形,上下颠倒又是一种,还有两个长方形,共三种

长度大于或等于3的区间中想要不与长度为2的情况重复,只能两个长方形相互重叠一个长度,在空缺处补正方形,上下颠倒即有两种

由以上可得通项公式,由通项公式可得递推公式


#include <iostream>
#include <cstring>
using namespace std;
int f[1000001];
int main()
{
    int cases,o;
    int n;
    memset(f,0,sizeof(f));
    f[0]=1;
    f[1]=2;
    f[2]=7;
    for (int i=3; i<=1000001; i++)
    {
        f[i]=(3*f[i-1]+f[i-2]-f[i-3]+10)%10;//为防止负数取模错误,要加上10
    }
    cin>>cases;
    for (o=1; o<=cases; o++)
    {
        cin>>n;
        cout<<f[n]<<endl;
    }
    return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:247412次
    • 积分:4478
    • 等级:
    • 排名:第6643名
    • 原创:204篇
    • 转载:48篇
    • 译文:0篇
    • 评论:24条
    最新评论