Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)
Total Submission(s): 3155 Accepted Submission(s): 1021
ios
題意:spa
求區間內第k個有且僅有x個4和y個7的數code
代碼:blog
//注意細節 #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int t,x,y,bit[30]; ll f[30][25][25],P,Q; ll dfs(int pos,int xx,int yy,int limit) { if(pos==0) return (xx==0&&yy==0); if(xx<0||yy<0) return 0; if(!limit&&f[pos][xx][yy]!=-1) return f[pos][xx][yy]; int max_b=limit?bit[pos]:9; ll ans=0; for(int i=0;i<=max_b;i++){ ans+=dfs(pos-1,xx-(i==4),yy-(i==7),limit&&(i==max_b)); } if(!limit) f[pos][xx][yy]=ans; return ans; } ll solve(ll O) { int pos=0; while(O){ bit[++pos]=O%10; O/=10; } return dfs(pos,x,y,1); } int main() { //freopen("in.txt","r",stdin); scanf("%d",&t); for(int cas=1;cas<=t;cas++){ printf("Case #%d:\n",cas); memset(f,-1,sizeof(f)); scanf("%lld%lld%d%d",&P,&Q,&x,&y); ll tmp1=solve(P); ll tmp2=solve(Q); int n;ll k; scanf("%d",&n); while(n--){ scanf("%lld",&k); if(tmp2-tmp1<k) { puts("Nya!");continue; } ll l=P+1,r=Q,ans; while(l<=r){ ll mid=(l+r)>>1; ll tmp=solve(mid); if(tmp-tmp1>=k) { ans=mid;r=mid-1; } else l=mid+1; } printf("%lld\n",ans); } } return 0; }