/...................................................................................................................................................................................................................................................................................\
题目分析:
题意:不能用num_1,num_2,num_3这三个数组和成最小的数。
即就是求母函数G(x)=(1+x+.....+x^num_1)(1+x^2+....+x^(2*num_2))(1+x^5+....X^(5*num_3))的展开式的 系数为零的指数; 若系数都不为零,则最小数为s+1;
错误分析:
开始没完全理解题目的意思,开始时把题目的num_1、num_2、num_3输入要求理解为scanf("%d %d %d",&num_1,&num_2,&num_3),num_1&&num_2&&num_3),导致Runtime Error(ACCESS_VIOLATION)好几次,找了好长时间都没找到错误,又从新把代码写了一遍还是没有通过后来找大神看代码才知道,num_1、num_2、num_3 的输入要请是三个数同时为0时,程序不执行,改过之后在提交一次就AC了。
\.................................................................................................................................................................................................................................................................................../
代码:
#include<stdio.h>
#include <iostream>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<list>
#include<vector>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
#define MAX 80005
int c1[MAX],c2[MAX];
int main()
{
int i,j,max,num_1,num_2,num_3;
while(scanf("%d%d%d",&num_1,&num_2,&num_3),num_1||num_2||num_3)
{
max=num_1*1+num_2*2+num_3*5;
for(i=0;i<=max;i++)
{
c1[i]=0;
c2[i]=0;
}
for(i=0;i<=num_1;i++) //为(1+x+.....+x^num_1)的系数赋初时值为1.
{
c1[i]=1;
}
for(i=0;i<=num_1;i++) //(1+x+……+x^num_1)(1+x^2+…… x^(2*num_2))的系数;
{
for(j=0;j<=num_2*2;j+=2)
{
c2[j+i]+=c1[i];
}
}
for(i=0;i<=num_2*2+num_1*1;i++) //改变范围变为(num_1*1+num_2*2)
{
c1[i]=c2[i];
c2[i]=0;
}
for(i=0;i<=num_1*1+num_2*2;i++) //(1+x+.....+x^num_1)(1+x^2+....+x^(2*num_2))(1+x^5+....X^(5*num_3))的系数;
{
for(j=0;j<=num_3*5;j+=5)
{
c2[j+i]+=c1[i];
}
}
for(i=0;i<=max;i++) //改变范围变为max=num_1*1+num_2*2+num_3*3;
{
c1[i]=c2[i];
c2[i]=0;
}
for(i=0; i<=max; i++)
if(c1[i] == 0)
{
printf("%d\n",i);
break;
}
if(i == max+1)
printf("%d\n", i);
}
return 0;
}