1. 程式人生 > >2018ICPC青島重現賽M

2018ICPC青島重現賽M

簽到題
定義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; }