题目链接

问题 A: 整数分解为 2 的幂
题目描述
任何正整数都能分解成 2 的幂,给定整数 N,求 N 的此类划分方法的数量!由于方案数量较大,输出 Mod 1000000007 的结果。
比如 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 输入
输入一个数 N(1≤N≤10^6) 输出
输出划分方法的数量 Mod 1000000007 样例输入
7
样例输出
6

先放结论:

为什么是这样呢?

首先来看 \(N\) 为奇数的情况:

举个例子,6的拆分方法为:

1 1 1 1 1 1
1 1 1 1 2
1 1 2 2
1 1 4
2 2 2
2 4

共6种分解方法。

7的拆分方法呢?

1 1 1 1 1 1 1
1 1 1 1 1 2
1 1 1 2 2
1 1 1 4
1 2 2 2
1 2 4

我们发现,7的拆分在6的拆分的基础上最大的区别即在每组拆分的开头都加上了一个 \(1\) 。

这个多出来的 \(1\) 理论上是可以和其它的 \(1\) 合并的,然并卵,我们发现,当:

1 1 1 1 1 1 1

合并一次后得到

1 1 1 1 1 2

时,本质上与原来的

1 1 1 1 1 2

没有任何区别。那么,我们就得到了第一条结论:

\[当N为奇数时,a[n]=a[n-1]
\]

我们再来看偶数

举个例子,还是6的分解方法:

1 1 1 1 1 1
1 1 1 1 2
1 1 2 2
1 1 4
2 2 2
2 4

我们把它分为有 \(1\) 的拆分部分和没有 \(1\) 的拆分部分

先看有 \(1\) 的拆分部分:

1 1 1 1 1 1
1 1 1 1 2
1 1 2 2
1 1 4

我们发现,把每一种拆分的第一个 \(1\) 盖住之后,我们会发现这与5的拆分方式没有本质上的区别,和奇数一样,我们得到了第一个部分:

\[a[n]=a[n-1]
\]

再看没有1的部分,

2 2 2
2 4

因为拆分的全都是2的次幂,当1即 \(2^0\) 没有后,我们把拆分的每一项的每一个数除以2得:

1 1 1
1 2

我们发现,这本质上就是3的拆分,那么,我们就得到了第二个结论:

\[a[n]=a[n/2]
\]

把两个部分加起来,就得到了偶数的个数公式:

\[a[n]=a[n-1]+a[n/2]
\]

那么看下代码:

#include<iostream>
using namespace std;
long long a[1000010];
int main(){
long long n;
a[1]=1;
for(long long i=2;i<=1000005;i++){
if(i%2==1){
a[i]=a[i-1]%1000000007;
}
else{
a[i]=(a[i-1]+a[i/2])%1000000007;
}
}
cin>>n;
cout<<a[n];
return 0;
}

The End.

[发布编辑时间]2022/2/18 20:52

[2022-2-18] OICLASS提高组模拟赛2 A·整数分解为2的幂的更多相关文章

  1. ZROI提高组模拟赛05总结

    ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...

  2. NOIP2017提高组 模拟赛15(总结)

    NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...

  3. NOIP2017提高组 模拟赛13(总结)

    NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...

  4. NOIP2017提高组模拟赛 10 (总结)

    NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...

  5. NOIP2017提高组模拟赛 8(总结)

    NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ...

  6. NOIP2017提高组模拟赛 9 (总结)

    NOIP2017提高组模拟赛 9 (总结) 第一题 星星 天空中有N(1≤N≤400)颗星,每颗星有一个唯一的坐标(x,y),(1≤x,y ≤N).请计算可以覆盖至少K(1≤K≤N)颗星的矩形的最小面 ...

  7. NOIP2017提高组模拟赛 7(总结)

    NOIP2017提高组模拟赛 7(总结) 第一题 斯诺克 考虑这样一个斯诺克球台,它只有四个袋口,分别在四个角上(如下图所示).我们把所有桌子边界上的整数点作为击球点(除了4个袋口),在每个击球点我们 ...

  8. NOIP2017提高组模拟赛5 (总结)

    NOIP2017提高组模拟赛5 (总结) 第一题 最远 奶牛们想建立一个新的城市.它们想建立一条长度为N (1 <= N <= 1,000,000)的 主线大街,然后建立K条 (2 < ...

  9. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

随机推荐

  1. 使用estimatedRowHeight的优缺点

    使用estimatedRowHeight的优缺点 1.优点 1> 可以降低tableView:heightForRowAtIndexPath:方法的调用频率 2> 将[计算cell高度的操 ...

  2. HTML 5的革新——语义化标签

    感谢原文作者:html5jscss 原文链接:http://www.html5jscss.com/html5-semantics-section.html 大佬的下一篇博文:http://www.ht ...

  3. iconv(gb2312<->utf-8)

    转载请注明来源:https://www.cnblogs.com/hookjc/ unix下安装PHP的module,需要重新编译PHP,Windows下安装模板,只需将php.ini里的配置打开相应的 ...

  4. Python property动态属性

    from datetime import datetime, date class User: def __init__(self, name, birthday): self.name = name ...

  5. sublime中的emmet插件的使用技巧

    1.我要生成一个2行3列,宽300px,高500px的表. table[width=300 height=500]>(tr>td{$}*3)*2

  6. MyBatis加强(1)~缓存机制(一级缓存、二级缓存、第三方缓存技术redis、ehcache)

    一.缓存机制 使用缓存可以使应用更快地获取数据,避免频繁的数据库交互操作,尤其是在查询越多,缓存命中率越高 的情况下,缓存的作用就越明显. 1.缓存原理:Map ■ 查询时,先从缓存区查询:找到,返回 ...

  7. kali中安装arpspoof 报错

    情境今天在使用arpspoof这个命令的时候,提示没有命令找不到,此时就想着安装一下没想到,碰上kali源不支持的问题  解决所以,此时需要做的就是安装阿里云或者其他镜像  步骤1. vim /etc ...

  8. Linux常用命令整理:文件目录管理

    据说,你要对Linux文件做的事情,98%都记录在这篇文章里了. 1.ls命令 最常见的命令,相信刚进入linux命令行界面的时候,都要用这个命令看看当前目录下都有哪些文件吧. 名称:List 含义: ...

  9. Cadence物理库 LEF 文件语法学习【持续更新】

    我是 雪天鱼,一名FPGA爱好者,研究方向是FPGA架构探索. 关注公众号,拉你进"IC设计交流群". @ 目录 一.LEF简介 1.1 通用规则 1.2 管理 LEF 文件 二. ...

  10. Spring中@Autowired 注解的注入规则

    默认根据类型,匹配不到则根据bean名字 1.声明一个service接口 public interface HelloService { void sayHello(); } 2.service接口的 ...