/...................................................................................................................................................................................................................................................................................\
题目分析:
题意:不能用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; }