第一次模拟

这一次模拟总的来说考的我猝不及防,文件那没听清楚所以一直在瞎搞结果浪费了一半的时间(悲

所以后来时间不够用了且不说,文件还搞错了!啊!当然估计交上去也得不了满分,有个地方的取模少了。

题不是什么难题,都是见过的。

T1:

 

 

 

 

 

 这很显然,一个杨辉三角敲上去。但是要注意这里的x,y有系数,所以先把他当整体带一下就会发现其实后来的系数是乘上了an和bm

然后就是不停地取模,哪里缺了都不行!

数组开的时候要小心!本来是想开局部的,但是发现开了以后就会输不进去,所以加了个static关键字在定义前,让他的空间和全局是一样的,不会爆。

#include<cstdio>
#include<cstring>
using namespace std;
const int mod = 10007;
int main(){
    int a,b,k,n,m;
    
    static int f[1110][1110];
    memset(f,0,sizeof(f));
    scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
    
    for(int i=1;i<=k+1;++i){
        for(int j=1;j<=i;++j){
            if(j == 1 || j == i)f[i][j] = 1;
            else f[i][j] = (f[i-1][j] + f[i-1][j-1])%mod;
        }
    }
    int ans = f[k+1][k-n+1];
    for(int i=1;i<=n;++i) ans = (ans%mod) *(a % mod)  %mod;
    for(int i=1;i<=m;++i) ans = (ans%mod) *(b % mod)  %mod;
    printf("%d",ans);
}

 

T2

 

这道题用递归和递推都是可以的。

递推的公式可以这样考虑:n层,把上面的n-1个看成整体,则只需要三步:

1、借c把n-1个放到b上

2、把第n个放到c上

3、借a把n-1个放c上

显然,结果就是f[i] = 2*f[i-1] + 1(n>=1) 边界为f[1] = 1

#include<cstdio>
using namespace std;
typedef long long ll;
int main(){
    ll f[35];
    int n;
    scanf("%d",&n);
    f[1] = 1;
    for(int i=2;i<=n;++i){
        f[i] = f[i-1] * 2 + 1;
    }
    printf("%lld",f[n]);
}

T3

 

 

 这题也是递推,我们可以这么想:退一步想,用n个填满可以看成是n-1个再放了一块,那么这一块可以怎么放?显然,横或者竖。

对于竖着的很显然可以有f[n-1]种方法,对于横着的,则必然还有一块和他一起横着,那么就是n-2块砖再加上他俩,有f[n-2]种方法

根据加法原理 f[n] = f[n-1] + f[n-2](n>=3) 边界为f[1] = 1 f[2] = 2

#include<cstdio>
using namespace std;
typedef long long ll;
int main(){
    ll f[55];
    int n;
    scanf("%d",&n);
    f[1] = 1;
    f[2] = 2;
    for(int i=3;i<=n;++i)f[i] = f[i-1] + f[i-2];
    printf("%lld",f[n]);
}

 

posted @ 2021-12-02 22:11  Xu_brezza  阅读(67)  评论(0编辑  收藏  举报