HDU 5491 The Next【】

xiaoxiao2021-02-28  110

The Next

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2080    Accepted Submission(s): 753 Problem Description Let  L  denote the number of 1s in integer  D ’s binary representation. Given two integers  S1  and  S2 , we call  D  a WYH number if  S1LS2 . With a given  D , we would like to find the next WYH number  Y , which is JUST larger than  D . In other words,  Y  is the smallest WYH number among the numbers larger than  D . Please write a program to solve this problem.   Input The first line of input contains a number  T  indicating the number of test cases ( T300000 ). Each test case consists of three integers  D S1 , and  S2 , as described above. It is guaranteed that  0D<231  and  D  is a WYH number.   Output For each test case, output a single line consisting of “Case #X: Y”.  X  is the test case number starting from 1.  Y  is the next WYH number.   Sample Input 3 11 2 4 22 3 3 15 2 5   Sample Output Case #1: 12 Case #2: 25 Case #3: 17 #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<queue> #include<stack> #include<vector> #include<algorithm> using namespace std; #define ll long long #define ms(a,b) memset(a,b,sizeof(a)) ll i,j,k,n,m; int s[100]; ll d,s1,s2; int main() { int T; scanf("%d",&T); int cas=1; while(T--){ scanf("%lld%lld%lld",&n,&s1,&s2); n++; while(1){ m=n; ll sum=0; ll w=0; while(m){ s[w++]=m&1; if(m&1)sum++; m>>=1; } if(sum<s1){ for(int i=0;i<w;i++) if(s[i]==0){ j=i;break; } n+=(1<<j); } else if(sum>s2) { for(int i=0;i<w;i++) if(s[i]==1){ j=i;break; } n+=(1<<j); } else break; } printf("Case #%d: %lld\n",cas++,n); } return 0; }  
转载请注明原文地址: https://www.6miu.com/read-30196.html

最新回复(0)