题目链接

问题 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. 关于基于python2.7的unity自动化测试框架GAutomator测试环境的搭建(源码网盘下载地址:https://pan.baidu.com/s/1c2TXwtU)

    关于基于python 2.7的unity自动化测试框架GAutomator测试环境的搭建 百度云盘链接(思维图学习资料):https://pan.baidu.com/s/1dFWExMD 准备工作(具 ...

  2. C++中三种正则表达式比较(C regex,C ++regex,boost regex)

    工作需要用到C++中的正则表达式,以下三种正则可供参考 1,C regex #include <regex.h> #include <iostream> #include &l ...

  3. IDEA学习系列之Module概念

    感谢原文作者:小manong 原文链接:https://www.jianshu.com/p/fcccc37fcb73 简单应用:IDEA Maven创建多个Module相互依赖 1.Module的概念 ...

  4. 监听器(Listener)详解及举例

    概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 监听器组成要素: 事件源:事 ...

  5. Maven警告解决:Using platform encoding (UTF-8 actually)

    感谢原文作者:Scorpip_cc 原文链接:https://www.jianshu.com/p/9c8c01f6bebc 执行Maven Install打包的时候,提示以下警告信息: [WARNIN ...

  6. Java线程--Exchanger使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11868576.html Java线程--Exchanger使用: Exchanger 是用来交 ...

  7. java程序出现oom如何解决?什么场景下会出现oom?

    1.什么是oom? OOM,全称"Out Of Memory",翻译成中文就是"内存用完了",来源于java.lang.OutOfMemoryError. 当J ...

  8. 使用rsync+inotify实现/www目录实时同步

    一.实现bak-server 1.1安装rsync # yum -y install rsync 1.2修改配置文件 # vi /etc/rsyncd.conf #添加下面内容 uid=test gi ...

  9. Redis 在 vivo 推送平台的应用与优化实践

    一.推送平台特点 vivo推送平台是vivo公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定.可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,支持百亿级的通知/消息推送,秒 ...

  10. Aselenium前言

    https://seleniumhq.github.io/docs/index.html https://www.seleniumhq.org/ THE SELENIUM BROWSER AUTOMA ...