Description
YOUSIKI学习了递推,于是他请皮皮妖给他出道题,皮皮妖说:
f(1)=1,f(i)=i-f(i-1),求f(n)
YOUSIKI看了一眼把它秒切了,于是他要求皮皮妖加大难度,皮皮妖想了想,说:
f(1)=1,f(i)=i-f(f(i-1)),求f(n)
YOUSIKI看了两眼把它秒切了,于是他要求皮皮妖加大难度,皮皮妖想了想,说:
f(1)=1,f(i)=i-f(f(f(i-1))),求f(n)
YOUSIKI看了三眼把它秒切了,于是他要求皮皮妖加大难度,皮皮妖想了想,说:
...
...
...
YOUSIKI看了m眼,但是没有能秒切,于是他找到你,请你帮他解决这个问题。
Input
一行两个正整数n,m。n<=10^18,m<=10^6
Output
一行一个整数f(n)
Sample Input
4 2
Sample Output
3 样例解释:f(1)=1,f(2)=2-f(f(1))=1,f(3)=3-f(f(2))=2,f(4)=4-f(f(3))=3
HINT
Source
By Monster_Yi
~~~~~~~~~~~~~~~~~~~~~~~~~
构造~
神奇的构造,没有听懂。占坑待填。
先链接一个超详细题解:http://blog.csdn.net/werkeytom_ftd/article/details/73065477~
#include<cstdio>
#define ll long long
ll n,m,a[5000001],i,ans;
int main()
{
scanf("%lld%lld",&n,&m);
for(i=0;i<=m;i++) a[i]=1;
for(;;i++)
{
a[i]=a[i-1]+a[i-m];
if(a[i]>n) break;
}
for(i--;n && i;i--) if(n>=a[i]) n-=a[i],ans+=a[i-1];
printf("%lld\n",ans);
return 0;
}