3 条题解

  • 1
    @ 2022-11-17 20:43:05
    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int a[25];
    int ans;
    bool is_prime(int x)
    {
        if (x < 2)
            return false;
        for (int i = 2; i * i <= x; i++)
            if (x % i == 0)
                return false;
        return true;
    }
    int dis[10];//dis[i]:第i个数选择ans[i] 
    bool vis[10];//vis[i]:a[i]有没有被选过 
    bool check(int nn){
    	int X=0;
    	for(int i=1;i<=nn;i++)
    		X+=i*dis[i];
    	return is_prime(X);
    }
    //当前考虑选谁作为第step个数
    void dfs(int step){
    	//之前已经选了step-1个数
    	if(check(step-1))
    		ans++;
    	if(step==n+1)
    		return;
    	//考虑第step个数选谁?
    	for(int i=1;i<=n;i++){
    		if(!vis[i])
    		{
    			//记录 
    			vis[i]=true;
    			dis[step]=a[i];
    			//做下一步 
    			dfs(step+1);
    			//取消记录 
    			vis[i]=false;
    			dis[step]=0; 
    		}
    	}
    }
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    		cin>>a[i];
    	ans=0;
    	dfs(1);
    	cout<<ans<<"\n";
    	return 0;
    }
    
    • 0
      @ 2022-11-12 22:19:21

      25ms筛法

      值得注意: 筛法数组至少开到2250000(=(1+9)*9/2*5e4) )

      #include<bits/stdc++.h>
      using namespace std;
      bool su[9000005],chosen[10];
      int n,cnt=0;
      int a[10];
      int ans[40];
      void dfs(int now,int he)
      {
          if(su[he])
          {
              /*              //去掉注释 输出每组解释
              cout<<he<<" = ";
              for(int i=1;i<=now-1;i++)
              {
                  if(i!=1)cout<<" +";
                  cout<<" "<<i<<" * "<<ans[i];
              }
              cout<<endl;
              */
             cnt++;
          }
          if(now>n)return;
          for(int i=1;i<=n;i++)
          {
              if(chosen[i]==0)
              {
                  chosen[i]=1;
                  ans[now]=a[i];
                  dfs(now+1,he+a[i]*now);//记录和更方便判定质数
                  chosen[i]=0;
              }
          }
      }
      
      int main()
      {
          memset(su,1,sizeof(su));//筛法
          su[0]=su[1]=0;
          for(int i=2;i<2250005;i++)
          {
              if(su[i]==0)continue;
              for(int j=2*i;j<2250005;j+=i)
                  su[j]=0;
          }
      
          cin>>n;
          for(int i=1;i<=n;i++)cin>>a[i];
          dfs(1,0);
          cout<<cnt;
          return 0;
      }
      
      • 0
        @ 2022-11-5 10:29:12

        再组合质数

        基本代码和上一题组合质数相差无几,唯一需要考虑的是本题的每一层深搜都需要从1-n,故需要查重数组进行查重,如果没有使用过再使用。

        可以写埃氏筛法,但是质数判断也可以直接写最简单、复杂度最高的,时间绰绰有余。

        #include<bits/stdc++.h>
        using namespace std;
        int n,a[30],num;
        bool use[50010];   //判断数组
        bool zhishu(int x)  //质数判断
        {
        	if(x==0||x==1) return false;
        	for(int i1=2;i1*i1<=x;i1++)
        		if(x%i1==0)
        			return false;
        	return true;
        }
        void dfs(int m,int sum)   //深搜(第几层,当前总和为多少)
        {
        	if(m>n+1) return;    //如果递归过深就直接返回
        	if(zhishu(sum)==true)
        	{
        		num++;
        		//cout<<'\n';
        	}    //如果当前加和为质数就总数+1
        	for(int i=1;i<=n;i++)
        	{
        		if(use[i]==false)  //如果当前数字没有被使用
        		{
        			use[i]=true;  //标记被使用
        			sum+=m*a[i];  //乘m然后加
        			//cout<<m<<" a[i]:"<<a[i]<<" sum"<<sum<<'\n';  //调试用代码,请忽略
        			dfs(m+1,sum);  //调用下一层
        			sum-=m*a[i];  //回溯
        			use[i]=false;
        		}
        	}
        	return;
        }
        int main()
        {
        	cin>>n;
        	for(int i=1;i<=n;i++)
        		cin>>a[i];
        	dfs(1,0);
        	cout<<num;
        	return 0;
        }
        
        • 1

        信息

        ID
        1135
        时间
        1000ms
        内存
        256MiB
        难度
        2
        标签
        递交数
        51
        已通过
        32
        上传者