蓝桥杯问题1105:数列
首先观察数列
比如k=3,
3
0
,
3
1
,
3
0
+
3
1
3^0,3^1,3^0+3^1
30,31,30+31
拿到题第一想法可能会把所有情况列出来再排序
但这样时间复杂度比较大,而且必须要算出n后面的数列
乍一看好像没有思路
但这题巧妙的地方就要转化一下固定思维模式
观察数列
k
0
×
1
,
k
1
×
1
+
k
0
×
0
,
k
1
×
1
+
k
0
×
1
k^0\times1,k^1\times1+k^0\times0,k^1\times1+k^0\times1
k0×1,k1×1+k0×0,k1×1+k0×1
如果把他转化为
K
K
K进制
1
,
10
,
10
+
1
1,10,10+1
1,10,10+1
有点像二进制
(可以带入k=10验证一下)
想到这这道题就非常清晰了
为了方便我们在转化为十进制
1
,
2
,
3
,
1,2,3,
1,2,3,
我们可以看出对数列
X
n
X_n
Xn,令
n
2
n_2
n2为n的二进制表示
有:
X
n
=
k
0
×
(
n
2
%
2
)
+
k
1
×
(
n
2
÷
2
%
2
)
⋯
⋯
X_n=k^0\times{({n_2}\% 2)}+k^1\times({n_2\div2\%2})\cdots\cdots
Xn=k0×(n2%2)+k1×(n2÷2%2)⋯⋯
这个式子可能不好理解
举个栗子
k
=
3
,
n
=
4
k=3,n=4
k=3,n=4
那么
n
2
=
100
n_2=100
n2=100
那么
X
4
=
3
0
×
0
+
3
1
×
0
+
3
2
×
1
=
9
X_4=3^0\times0+3^1\times0+3^2\times1=9
X4=30×0+31×0+32×1=9
用代码实现一下
#include<stdio.h>
int main()
{
int k,n,sum=0,i,j=0,m;
scanf("%d%d",&k,&n);
while(n)//n为0时退出循环
{
if(n%2==1)
{
m=1;
for(i=1;i<=j;i++)//用m表示k的j次方
{
m*=k;
}
sum+=m;
}
//这里其实应该写一个else 但0*k^m=0,所以加不加无所谓
j++;
n/=2;
}
printf("%d",sum);
return 0;
}
但
k
j
k^j
kj这里有个问题,一开始我用的是数学库里的power函数
没能通过,改成手动写一个就好了
可能因为精度?