3 条题解

  • 1
    @ 2024-2-24 13:43:41
    #include <iostream>
    using namespace std;
    int n,m,x[1005],num;
    int main (){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            cin>>x[i];
        }
        for(int i=1;i<(1<<n);i++){
            if(__builtin_popcount(i)!=m)//判断第i位1的个数是不是等于m
            {
                continue;
            }
            int cnt = 0;
            for(int j=0;j<n;j++){
                if(i &(1<<j))
                {
                    cnt+=x[j+1];
                }
            }
            bool w=true;
            
            for(int j=2;j<=cnt-1;j++){
                if(cnt%j==0)
                {
                    w=false;
                    break;
                }
            }
            if(w){
                num+=1;
            }
    
    
        }
        cout<<num; 
        return 0;  
    }
    

    细节分析阶段:

    1. 读取两个整数nm,其中n表示接下来要输入的数组x的长度,m表示需要从数组x中选取的数字个数。
    2. 使用一个长度为1005的整数数组x来存储输入的n个整数。
    3. 使用一个整数num来统计满足条件的组合数量。
    4. 第一个for循环用于读取数组x中的n个整数。
    5. 第二个for循环使用位运算来遍历数组x的所有2^n种可能子集(包括空集)。i从1到2^n-1,每个i都表示一个特定的子集,其中第j位为1表示选择了x[j+1]
    6. 使用__builtin_popcount(i)函数来计算i中1的个数,即当前子集包含的元素个数。如果这个个数不等于m,则跳过当前循环,继续下一个子集。
    7. 第三个for循环计算当前子集中所有数字的和cnt
    8. 接下来的代码块检查cnt是否为质数。如果cnt可以被2到cnt-1之间的任何数字整除,则cnt不是质数,将w设为false并跳出循环。如果cnt是质数,则将num增加1。
    9. 最后,输出num,即满足条件的组合数量。

    总结阶段:

    这段代码的目的是找出数组x中选取m个数字的所有可能组合中,哪些组合的和是质数,并统计这样的组合有多少个。代码使用位运算来生成所有可能的子集,并使用内建函数__builtin_popcount来检查每个子集中的元素个数。然后,它检查每个子集的和是否为质数,并相应地更新计数器num。最后,输出计数结果。

    • 0
      @ 2024-5-31 13:15:33
      #include<bits/stdc++.h>
      using namespace std;
      int n,m,x[1005],num;
      int main (){
          cin>>n>>m;
          for(int i=1;i<=n;i++){
              cin>>x[i];
          }
          for(int i=1;i<(1<<n);i++){
              if(__builtin_popcount(i)!=m)//判断第i位1的个数是不是等于m
              {
                  continue;
              }
              int cnt = 0;
              for(int j=0;j<n;j++){
                  if(i &(1<<j))
                  {
                      cnt+=x[j+1];
                  }
              }
              bool w=true;
              
              for(int j=2;j<=cnt-1;j++){
                  if(cnt%j==0)
                  {
                      w=false;
                      break;
                  }
              }
              if(w){
                  num+=1;
              }
      
      
          }
          cout<<num; 
          return 0;  
      }
      
      • -1
        @ 2023-12-15 22:43:30
        #include <bits/stdc++.h>
        using namespace std;
        int n,k,a[20],ans;
        int main(){
            cin>>n>>k;
            for(int i=1;i<=n;i++)cin>>a[i];
            for(int i=1;i<(1<<n);i++){
                if(__builtin_popcount(i)!=k)continue;
                int sum=0;
                for(int j=0;j<n;j++)
                    if(i&(1<<j))sum+=a[j+1];
                int bo=1;
                for(int j=2;j*j<=sum;j++)
                    if(sum%j==0){bo=0;break;}
                if(bo)ans++;
            }
            cout<<ans;
            return 0;}
        
        • 1

        信息

        ID
        612
        时间
        1000ms
        内存
        256MiB
        难度
        4
        标签
        递交数
        197
        已通过
        92
        上传者