qzezoj 1584 数字序列
题面传送门
考虑把两个操作合并,会发现把每\(4\)个分为一组,会剩下第\(3\)个。
则我们可以很容易地推出递推式:\(f_{x}=4\times f_{\frac{x+1}{4}}-1\)
则我们就可以很容易地找到最后剩下的位置了。
那么根据位置求数字就很简单了。
代码实现:
#include<cstdio>
#include<cmath>
using namespace std;
long long n,m,k,ans,tot,pus,f,now;
inline long long find(long long x){
if(x==1||x==2) return 1;
return 4*find((x+1)/4)-1;
}
int main(){
// freopen("1.in","r",stdin);
register int i;
while(~scanf("%lld",&n)){
tot=1;pus=n;f=0;
for(i=1;i<=16;i++){
tot*=10;
if(pus>tot-tot/10) pus-=tot-tot/10,f+=(tot-tot/10)*i;
else{f+=i*pus;break;}
}
ans=find(f);
//printf("%lld\n",ans);
tot=1;pus=ans;f=now=k=0;
for(i=1;i<=16;i++){
tot*=10;
if(pus>i*(tot-tot/10)) pus-=i*(tot-tot/10);
else{
now=(pus-1)/i+1;
k=(pus-1)%i+1;
now+=tot/10-1;
//printf("%lld\n",now);
printf("%lld\n",(long long)(now/pow(10,i-k))%10);
break;
}
}
}
}