题意
有一个函数
f(x)
f
(
x
)
,其中
f(1)=1
f
(
1
)
=
1
,定义
f1(n)=f(n),fm(n)=f(fm−1(n−1))
f
1
(
n
)
=
f
(
n
)
,
f
m
(
n
)
=
f
(
f
m
−
1
(
n
−
1
)
)
,那么有
f(n)=n−fm(n−1)
f
(
n
)
=
n
−
f
m
(
n
−
1
)
。给出
n,m
n
,
m
,求
f(n)
f
(
n
)
n≤1018,m≤106
n
≤
10
18
,
m
≤
10
6
分析
比较神的一道题,具体做法可以看出题人的博客。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
typedef long long LL;
int m;
LL n,g[5000005];
int main()
{
scanf("%lld%d",&n,&m);
for (int i=0;i<=m;i++) g[i]=1;
int t;
for (int i=m+1;;i++)
{
g[i]=g[i-1]+g[i-m];
if (g[i]>n) {t=i-1;break;}
}
LL ans=0;
for (int i=t;i>=1;i--)
if (g[i]<=n) n-=g[i],ans+=g[i-1];
printf("%lld",ans);
return 0;
}