整数拆分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整数拆分相关的知识,希望对你有一定的参考价值。
题目描写叙述
一个整数总能够拆分为2的幂的和,比如:
7=1+2+4
7=1+2+2+2
7=1+1+1+4
7=1+1+1+2+2
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
统共同拥有六种不合的拆分体式格式。
再比方:4能够拆分成:4 = 4,4 = 1 + 1 + 1 + 1。4 = 2 + 2。4=1+1+2。
用f(n)默示n的不合拆分的种数,比如f(7)=6.
请求编写法度,读入n(不跨越1000000),输出f(n)%1000000000。
输入:
每组输入包括一个整数:N(1<=N<=1000000)。
输出:
对于每组数据,输出f(n)%1000000000。
例子输入:
7
例子输出:
6
分析
对于奇数n=2k+1:它的拆分的第一项必定是1,推敲去掉这个1,事实上就一一相应于
2k的拆分。是以f(2k+1)=f(2k).
对于偶数n=2k:推敲有1和没有1的拆分。有1的拆分,与(2k-1)的拆分一一相应。与上方奇数的景象
来由雷同;没有1的拆分,将每项除以2,正好一一相应于k的全部拆分。是以f(2k)=f(2k-1)+f(k).
需要重视f(n)会非常大。不要溢出了。终极成果仅仅请求除以十亿的余数,在int的默示局限内,
是以不需要大数运算。
重视余数的性质:(a+b)%m == (a%m+b%m)%m。所以仅仅要对每一个中心
成果也都取余数,就不会有溢出的题目。且不改变终极输出成果。
#include <stdio.h>
int f[1000001];
int main()
{
int i,n;
while(scanf("%d",&n)!=EOF)
{
f[0]=1;
f[1]=1;
for(i=2;i<=n;i++)
{
if(i%2==0)
f[i]=(f[i-1]+f[i/2])%1000000000;
else
f[i]=f[i-1];
}
printf("%d\n",f[n]);
}
}
以上是关于整数拆分的主要内容,如果未能解决你的问题,请参考以下文章
为啥将拆分为 wav 文件的旋律转换为拆分的 mp3 会在片段边界处产生不好的声音?
pandas GroupBy上的方法apply:一般性的“拆分-应用-合并”