有1克、2克、...、n克的砝码各一枚,能称出哪几种重量?总共有几种可能方案?

有1克、2克、…、n克的砝码各一枚,能称出哪几种重量?总共有几种可能方案?

1个1克的砝码可以用函数1+x表示,
1个2克的砝码可以用函数1+x2表示,
1个3克的砝码可以用函数1+x3表示,
1个4克的砝码可以用函数1+x4表示

最大重量为1+2+3+……n;
重量种数就是等差数列前n项和

方案数为g(x) x1 到xn+n*(n-1)/2 的系数和
比如当n等于4时,
g(x)=(1+x)(1+x2 )(1+x3)(1+x4)
=1+x+x2+2x3+2x4+2x5+2x6+2x7+x8+x9+x10
系数和为15,方案数有15种

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;//取模
const int N=1000;
typedef long long LL;
int x[500000],temp[500000]; //temp为临时
void solve(int n){
    memset(x,0,sizeof(x));
    memset(temp,0,sizeof(temp));
    x[0]=1;
    x[1]=1;
    for(int i=2;i<=n;i++){   //模拟一波多项式相乘
        for(int j=0;j<=i-1+0.5*(i-1)*(i-2);j++){
                 temp[j]=x[j];
        }
        for(int j=0;j<=i-1+0.5*(i-1)*(i-2);j++)  
             temp[j+i]+=x[j];
        for(int k=0;k<=i+0.5*(i)*(i-1);k++)
              x[k]=temp[k];
      //  for(int k=0;k<=i+0.5*(i)*(i-1);k++)
      //      cout<
      //      cout<
    }
}

int main(){
     int n;
     while(cin>>n){
         solve(n);
         int sum=0;
      //   for(int i=1;i<=10;i++)
        //   cout<
        //   cout<
          for(int i=1;i<=n+0.5*n*(n-1);i++)
              sum+=x[i];
          cout<<n+0.5*n*(n-1)<<" ";
          cout<<sum<<endl;
     }
}

你可能感兴趣的:(ACM,acm,生成函数)