Description

任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量!
比如N = 7时,共有6种划分方法。

7=1+1+1+1+1+1+1
=1+1+1+1+1+2
=1+1+1+2+2
=1+2+2+2
=1+1+1+4
=1+2+4

Solution

设gi,j,kg_{i,j,k}表示一个序列组成2i2^i这个数,这个序列中最大的数为2j2^j,最小的为2k2^k的方案数;
设fi,jf_{i,j}表示已经做完了输入的数的后i位二进制,序列中最大的数为2j2^j的方案数;

gi,j,k=∑l=kjgi−1,j,l∗(∑t=klgi−1,t,k)

g_{i,j,k}=\sum_{l=k}^jg_{i-1,j,l}*(\sum_{t=k}^lg_{i-1,t,k})

fi,j=∑k=1jgi,j,k∗(∑l=1kfi−1,l)

f_{i,j}=\sum_{k=1}^jg_{i,j,k}*(\sum_{l=1}^kf_{i-1,l})
有两个很显然可以用前缀和,
复杂度: O(n4)O(n^4)

优化:
发现有性质

gi,j,k=gi−1,j−1,k−1=gi−2,j−2,k−2=......

g_{i,j,k}=g_{i-1,j-1,k-1}=g_{i-2,j-2,k-2}=......

所以只要记录g′i,jg'_{i,j}表示由最大2j2^j最小202^0组成2i2^i的方案数即可,

注意题目没有mo,要用高精度!
复杂度:O(n3∗高精度)O(n^3*高精度)

Code

标程只加了gi,j,k=gi−1,j−1,k−1g_{i,j,k}=g_{i-1,j-1,k-1}的优化,所以很丑QwQ而且还要卡常QwQ:

#include <cstdio>
#include <cstdlib>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define max(q,w) ((q)>(w)?(q):(w))
using namespace std;
typedef long long LL;
const int N=102,YW=1000000000,YW1=9;
int m,n;
int a[N],z[N];
struct qqww
{int n;int a[151];
}f[2][N],g[2][N][N],LIN,YI,t;
int ss(int w)
{if(!a[0])return 0;int q=0;fod(i,a[0],1){a[i]+=q*10;q=a[i]&1;a[i]>>=1;}if(!a[a[0]])a[0]--;int OU=q;q=ss(w+1)+1;z[w]=OU;return q;
}
qqww s;
qqww operator * (qqww a,qqww b)
{if((a.n<2&&a.a[1]==0))return a;if((b.n<2&&b.a[1]==0))return b;fo(i,1,s.n)s.a[i]=0;s.n=a.n+b.n-1;fo(i,1,a.n)fo(j,1,b.n){LL t=s.a[i+j-1]+(LL)a.a[i]*b.a[j];s.a[i+j-1]=t%YW;s.a[i+j]+=t/YW;}while(s.a[s.n+1]){s.n++;s.a[s.n+1]+=s.a[s.n]/YW;s.a[s.n]%=YW;}return s;
}
qqww operator + (qqww a,qqww b)
{a.n=max(a.n,b.n);fo(i,1,a.n){a.a[i]+=b.a[i];while(a.a[i]>=YW){a.a[i+1]++;a.a[i]-=YW;}}while(a.a[a.n+1]){a.n++;a.a[a.n+1]+=a.a[a.n]/YW;a.a[a.n]%=YW;}return a;
}
int main()
{char ch;for(char ch=getchar();ch<='9'&&ch>='0';ch=getchar())a[++a[0]]=ch-48;fo(i,1,a[0]/2){int t=a[i];a[i]=a[a[0]-i+1];a[a[0]-i+1]=t;}n=ss(1);g[0][1][1].n=g[0][1][1].a[1]=1;fo(i,1,n)f[0][i].n=f[0][i].a[1]=1;bool nw=1,nwg=1;fo(i,2,n){fo(I,1,g[nwg][i][i].n)g[nwg][i][i].a[I]=0;g[nwg][i][i].n=g[nwg][i][i].a[1]=1;fo(I,1,g[nwg][1][1].n)g[nwg][1][1].a[I]=0;g[nwg][1][1].n=g[nwg][1][1].a[1]=1;fo(j,2,i-1)fo(k,2,j){fo(I,1,max(g[nwg][j][k].n,g[!nwg][j-1][k-1].n))g[nwg][j][k].a[I]=g[!nwg][j-1][k-1].a[I];g[nwg][j][k].n=g[!nwg][j-1][k-1].n;}fo(j,1,i-1){fo(I,1,max(t.n,g[!nwg][1][1].n))t.a[I]=g[!nwg][1][1].a[I];t.n=g[!nwg][1][1].n;g[nwg][j][1]=(g[!nwg][j][1]*t);fo(k,2,j){t=t+g[!nwg][k][1];g[nwg][j][1]=g[nwg][j][1]+g[!nwg][j][k]*t;}}if(z[i]){fo(j,1,n){fo(I,1,max(f[nw][j].n,f[nw][j-1].n))f[nw][j].a[I]=f[nw][j-1].a[I];f[nw][j].n=f[nw][j-1].n;fo(k,1,n)f[nw][j]=f[nw][j]+g[nwg][j][k]*f[!nw][k];}nw=!nw;}nwg=!nwg;}printf("%d",f[!nw][n].a[f[!nw][n].n]);fod(i,f[!nw][n].n-1,1)printf("%09d",f[!nw][n].a[i]);printf("\n");return 0;
}

【51NOD 1048】【51NOD 1383】整数分解为2的幂 V2相关推荐

  1. 51Nod 1048 1383 整数分解为2的幂

    任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量! 比如N = 7时,共有6种划分方法. 7=1+1+1+1+1+1+1 =1+1+1+1+1+2 =1+1+1+2+2 =1+2+2+ ...

  2. 51Nod-1383 整数分解为2的幂【数列】

    1383 整数分解为2的幂  任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量!由于方案数量较大,输出Mod 1000000007的结果. 比如N = 7时,共有6种划分方法. 7=1 ...

  3. 51nod 13831048 整数分解为2的幂 [递推]【数学】

    题目连接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1048 ---------------------------- ...

  4. 51Nod 13831048 整数分解为2的幂

    题目 任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量. V1:n≤106n≤106n≤10^6.要对答案模1e9+71e9+71e9+7. V2:n≤1030n≤1030n≤10^{ ...

  5. [51nod13831048]整数分解为2的幂

    题目大意 任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量! 比如N = 7时,共有6种划分方法. 7=1+1+1+1+1+1+1 =1+1+1+1+1+2 =1+1+1+2+2 =1 ...

  6. [递推] 51Nod1383 整数分解为2的幂

    简单的递推,类似背包那种加 11 或翻倍的思路. 写这题其实只是水一篇 blogblog ,其实注意还是要做 51nod1048 加强版-- #include<cstdio> #inclu ...

  7. VJ 1033 整数分解(版本2)

    描述 整数分解(版本2) 一个正整数可以分解成若干个自然数之和.请你编一个程序,对于给出的一个正整数n(1<=n<=1500),求出满足要求的分解方案,并使这些自然数的乘积m达到最大. 例 ...

  8. 7-37 整数分解为若干项之和(20 分)

    7-37 7-37 整数分解为若干项之和(20 分) 将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,-.编程求出正整数N的所有整数分解式子. 输入 ...

  9. 分解 python_面试官:如何用Python实现将一个整数分解成质因数?

    概述 今天主要分享一个关于分解质因数的实例,判断的逻辑稍微多了点,一起来看看吧~ 需求 将一个整数分解质因数.例如:输入90,打印出90=233*5 思路 其实根本不需要判断是否是质数,从2开始向数本 ...

最新文章

  1. 打造最好用的离线QQ截图工具 C#
  2. 基于MATLAB的小波去噪
  3. 数据库——环境初建改端口和密码(转)
  4. JAVA面试——计算机网络
  5. jQuery-DOM操作
  6. FaunaDB and serverless and bmob
  7. PROC文件及文件夹创建
  8. Pandas DataFrame 函数应用和映射
  9. 火山安卓简单分组列表框
  10. 《硬核干货》简单好用视频、图片、文件MD5值修改工具类
  11. STM32学习记录0004——ISP串口下载
  12. 麟龙指标通达信指标公式源码_通达信仿麟龙决策曲线指标公式(选股公式/源码)...
  13. 【⭐阅读推荐指数:5颗星★★★★★⭐】关于多副本纠删码,你想知道的全都在这里
  14. java openoffic linux_Linux下安装OpenOffice
  15. 力扣121题 “买卖股票的最 佳时机”
  16. lisp+等高线点线矛盾检查_基于AutoCAD平台地形图高程点与等高线点线矛盾检测方法研究与实现...
  17. 第一台电子计算机教授领导,第一台电子计算机
  18. JavaWeb-学生宿舍管理系统
  19. 我叫mt4最新服务器,我叫mt4怎么看服务器等级上限 经验上限查看方法详解
  20. 电脑仙人掌机器人作文_仙人掌的作文20篇

热门文章

  1. Maven基础-Maven的生命周期、命令和插件(6)- mvn test命令详解
  2. 轮询查找连接电脑设备IP地址
  3. 生成Base64编码格式的二维码图片(添加url地址图片logo)
  4. 【RAC】RAC相关基础知识
  5. 读《MySQL性能调优与架构设计》笔记之ORDER BY,GROUP BY 和DI STI NCT 优化
  6. 25 岁,毕业写前端的这三年
  7. 归一化互相关(NCC)及其部分应用场景
  8. MATLAB experiment<3>
  9. 使用Python获取微信朋友圈的内容
  10. BUUCTF Url编码