C~F Java题解,代码已去除冗余~~~

C 小苯的与三角形

由于两数的与运算结果一定不大于两数的最小值,因此y的最高位必须要与x的最高位相同,否则不构成有效三角形,而题目有要求y小于x,因此在x比特数为1的时候需要特判,时间复杂度O(T)

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        for(int i=sc.nextInt();i!=0;i--){
            int x=sc.nextInt();
            System.out.println(Integer.bitCount(x)==1?-1:1<<(int)(Math.log(x)/Math.log(2)));
        }
    }
}

D 小苯的序列染色

由题意可知,字符串末尾必定不是1,且假如,字符串是由若干段连续1构成的话,第一段1也构不成一个连续1,一次判断即可,实际爱你复杂度O(Tn)

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        for(int i=sc.nextInt();i!=0;i--){
            int n=sc.nextInt();
            String s=sc.next();
            boolean ok=s.charAt(n-1)=='0';
            for(int j=0;j<n;j++){
                if(s.charAt(j)=='1'){
                    int p=j;
                    while(p<n&&s.charAt(p)=='1'){
                        p++;
                    }
                    ok&=p-j>1;
                    break;
                }
            }
            System.out.println(ok?"YES":"NO");
        }
    }
}

E 小苯的数字操作

无视掉k的大小,所有操作可以视为,n右移到某一位的时候,此时数字为奇数,它以及它的若干次乘2的数字的集合,直到n减少为0为止,时间复杂度O(Tlogn)

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        for(int i=sc.nextInt();i!=0;i--){
            int n=sc.nextInt(),k=sc.nextInt();
            long ans=0;
            while(n!=0&&k>=0){
                int p=find(n);
                ans+=k-Math.max(-k,-p)+1;
                k-=p+1;
                for(int j=0;j<=p;j++){
                    n>>=1;
                }
            }
            if(n==0&&k>=0){
                ans++;
            }
            System.out.println(ans);
        }
    }
    static int find(int a){
        int ans=0;
        for(;a%2==0;a>>=1,ans++);
        return ans;
    }
}

F 小苯的小球分组

参考资料

先假设,每种集合的分组数就是两个一组,再枚举每一种小球作为绝对众数的前提下贡献变化多少,时间 复杂度O(Tn^2+C^2),C==5000

import java.util.*;
public class Main{
    static int mod=998244353,comb[][]=new int[5005][5005];
    static{
        for(int i=0;i<=5000;i++){
            comb[i][0]=1;
            for(int j=1;j<=i;j++){
                comb[i][j]=(comb[i-1][j]+comb[i-1][j-1])%mod;
            }
        }
    }
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        for(int i=sc.nextInt();i!=0;i--){
            int n=sc.nextInt();
            Map<Integer,Integer> map=new HashMap<>();
            for(int j=0;j<n;j++){
                int a=sc.nextInt();
                map.put(a,map.getOrDefault(a,0)+1);
            }
            long ans=0;
            for(int j=1;j<=n;j++){
                ans=(ans+(j+1)/2L*comb[n][j])%mod;
            }
            for(int a:map.values()){
                for(int j=1;j<=a;j++){
                    for(int k=0;k<j&&k+a<=n;k++){
                        //总长度为j+k,
                        ans=(ans+comb[n-a][k]*(j-(j+k+1L)/2)%mod*comb[a][j])%mod;
                    }
                }
            }
            System.out.println(ans);
        }
    }
}