第一次模拟
这一次模拟总的来说考的我猝不及防,文件那没听清楚所以一直在瞎搞结果浪费了一半的时间(悲
所以后来时间不够用了且不说,文件还搞错了!啊!当然估计交上去也得不了满分,有个地方的取模少了。
题不是什么难题,都是见过的。
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]); }