bzoj4926 皮皮妖的递推

来源:互联网 发布:修真的程序员txt下载 编辑:程序博客网 时间:2024/05/22 10:29

我们构造数列g,使得

g(i)={1g(i1)+g(im)(0im)(i>m)

贪心地分解n得到n=ki=1gxi那么fm(n)=ki=1gxi1

#include<cstdio>  #include<algorithm>  using namespace std;  #define LL long long  const int maxn=10000010;  LL g[maxn],n,ans;  int m;  int main()  {      int p;      scanf("%lld%d",&n,&m);      for (int i=0;i<=m;i++) g[i]=1;      for (int i=m+1;;i++)      {          g[i]=g[i-1]+g[i-m];          if (g[i]>n)          {              p=i;              break;          }      }      for (int i=p-1;n;i--)          if (n>=g[i])          {              ans+=g[i-1];              n-=g[i];          }      printf("%lld\n",ans);  }