把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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;
            }
        }
    }
}
posted @ 2020-04-03 09:31  275307894a  阅读(51)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end