题目描述
元旦过去了,新年大酬宾活动也已经告一段落了。陈盖历望着堆在仓库的瓷砖,很无聊的他把这些瓷砖裁成很多1X1 1X2 1X3的小瓷砖,然后他把这些小瓷砖排在地上画的一个1*n的长方形里。问铺满这个长方形共有多少种方法?
输入
首先输入一个整数T,表示有T组测试数据 然后是T行,每行输入1个正整数n(n<=50)
输出
对于每个n输出铺的方法种数
样例输入 Copy
3 1 2 3
样例输出 Copy
1 2 4
什么东西,标准程序都是错的,明明n《=50,n45就溢出了???故意改成溢出就对了???
#include<stdio.h>
int jc[55];
void jijib(int x, int n,long long *times) {
int i, j,flag=1;
for ( i = 2; i <= x; i++) {
flag=1;
for ( j = 2; j <= n; j++) {
if (!(jc[j] % i)) {
jc[j] /= i;
flag=0;
break;
}
}
if(flag){
*times*=i;
}
}
}
long long solve(int a, int b, int c, int n) {
long long sum = 1,time=1;
int i;
for ( i = 1; i <= n; i++) {
jc[i] = i;
}
if (a)jijib(a, n,&time);
if (b)jijib(b, n,&time);
if (c)jijib(c, n,&time);
for ( i = 2; i <= n; i++) {
sum *= jc[i];
}
return sum/time;
}
int main() {
int k, n, t1, t2, t3;
long long cnt;
scanf("%d", &k);
while (k--) {
scanf("%d", &n);
cnt = 0;
for (t1 = 0; t1 * 3 <= n; t1++) {
for (t2 = 0; t1 * 3 + t2 * 2 <= n; t2++) {
for (t3 = 0; t1 * 3 + t2 * 2 + t3 <= n; t3++) {
if (t1 * 3 + t2 * 2 + t3 == n) cnt += solve(t1, t2, t3, t1 + t2 + t3);
}
}
}
printf("%lld\n", cnt);
}
}
/**************************************************************
Problem: 3922
User: 1325550810
Language: C
Result: 答案错误?????
****************************************************************/