2018ICPC青岛重现赛M

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/westbrook1998/article/details/83957911

签到题
定义f(x)就是x这个数(0-9)含有的圈的个数,然后再定义函数g(x),0次的时候就是x,然后每加一次幂就是f(x)一次
1e9想想应该可以直接暴力循环,第一次tle,然后仔细一想到最后其实很多都是0-1-0-1这样变化的,真正有效的变化只有前面几个,所以循环到g(x)值为0就可以判断然后break了

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
ll x,k;
int f[10]={1,0,0,0,1,0,1,0,2,1};
int main(void){
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld",&x,&k);
        ll ans=x;
        for(int i=1;i<=k;i++){
            ll t=0;
            if(ans==0){
                t+=f[0];
            }else{
                while(ans){
                    t+=f[ans%10];
                    ans/=10;
                }
            }
            if(t==0){
                if((k-i)%2){
                    ans=1;
                }else{
                    ans=0;
                }
                break;
            }
            ans=t;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/westbrook1998/article/details/83957911