MagicScaring

HDU1709

Dec 27th, 2017
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. /*
  2. 该题使用的母函数有点特殊 因为x的次数可以为负
  3. 如测试数据
  4. 3
  5. 1 2 9
  6. 可以使用这样的母函数:(1+x+x^-1)*(1+x^2+x^-2) *(1+x^9+x^-9) ,
  7. 根据天枰的特点可以建模成像这样的母函数。
  8. 而算的时候是计算 (1+x+x^2)*(1+x^2+x^2) *(1+x^9+x^18)/(^1*x^2*x^9 ),
  9. 在该结果中大于0的指数中找 哪些指数的系数是0
  10. */
  11. #include <iostream>
  12. #include<cstdio>
  13. #include<cstring>
  14. using namespace std;
  15. #define M 10000
  16. #define N 100
  17. #define MS(x) memset(x,0,sizeof(x))
  18. int n,sum;
  19. int c1[M+1],c2[M+1];
  20. int num[M+1],val[N+1];
  21. void solve()
  22. {
  23.     MS(c1);
  24.     MS(c2);
  25.     int i,j,k;
  26.     for(i=0;i<=val[1]*num[val[1]];i+=val[1])
  27.         c1[i]=1;
  28.     for(i=2;i<=n;++i)
  29.     {
  30.         for(j=0;j<=sum;++j)
  31.         {
  32.             for(k=0;k+j<=sum&&k<=val[i]*num[val[i]];k+=val[i])
  33.             {
  34.                  if(k>=j)c2[k-j]+=c1[j];
  35.                     else  c2[j-k]+=c1[j];
  36.                  c2[j-k]+=c1[j];
  37.                  c2[k+j]+=c1[j];
  38.             }
  39.         }
  40.         for(j=0;j<=sum;++j)
  41.         {
  42.             c1[j]=c2[j];
  43.             c2[j]=0;
  44.         }
  45.     }
  46. }
  47. int main()
  48. {
  49.     while(scanf("%d",&n)!=EOF)
  50.     {
  51.         MS(num);
  52.         MS(val);
  53.         sum=0;
  54.         int i;
  55.         for(i=1;i<=n;++i)
  56.         {
  57.             scanf("%d",&val[i]);
  58.             sum+=val[i];
  59.             num[val[i]]=1;
  60.         }
  61.         solve();
  62. //        for(i=1;i<=sum;++i)
  63. //        printf("%d ",c1[i]);
  64. //        printf("\n");
  65.         int k=0;
  66.         MS(num);
  67.         for(i=1;i<=sum;++i)
  68.         {
  69.             if(!c1[i])
  70.                 num[k++]=i;
  71.         }
  72.         if(!k)
  73.             printf("0\n");
  74.         else
  75.         {
  76.             printf("%d\n",k);
  77.         for(i=0;i<k;++i)
  78.             printf("%d%c",num[i],i==k-1?'\n':' ');
  79.         }
  80.     }
  81.  //   cout << "Hello world!" << endl;
  82.     return 0;
  83. }
Add Comment
Please, Sign In to add comment