6 条题解

  • -1
    @ 2023-1-31 19:24:23

    数据有点大,筛质数要快

    如果你还在用这个朴素算法:

    bool su(int x)
    {
        for(int i = 2; i * i <= x; i++)
        {
            if(x % i == 0)
            {
                return 1;
            }
        }
        return 0;
    }
    

    image

    听取TLE声一片


    prime:

    有点耳熟

    bool prime[N];
    void prime_find(int x)
    {
        prime[1] = 1;
    	for(int i = 2; i * i <= x; i++)
    	{
    		if(prime[i] == 0)
    		{
    			for(int j = i * i; j <= m; j += i)
    			{
    				prime[j] = 1;
    			}
    		}
    	}
    }
    

    image

    峰值时间38ms,跑得飞快


    最后放上完整代码

    #include <iostream>
    #include <stack>
    #include <cmath>
    #include <vector>
    #include <string.h>
    #include <queue>
    #include <stdio.h>
    #include <iomanip>
    #include <cstdio>
    #include <algorithm>
    #define int long long
    using namespace std;
    const int N = 4e6 + 10;//<-
    const int INF = 0x3f3f3f3f;
    int n, m, k;
    bool prime[N];//筛素数
    void prime_find(int x)
    {
        prime[1] = 1;
    	for(int i = 2; i * i <= x; i++)
    	{
    		if(prime[i] == 0)
    		{
    			for(int j = i * i; j <= m; j += i)
    			{
    				prime[j] = 1;
    			}
    		}
    	}
    }
    signed main()
    {
    	cin >> n >> m >> k;
        prime_find(m);
        if(n % 2 == 0)
        {
            n++;//微调,避免是偶数
        }
        int ans = 0;
        for(int i = n; i <= m; i += 2)//两个两个加
        {
            if(prime[i] == 0)//是素数
            {
                int sum = i;
                while(sum)//分离数位
                {
                    int l = sum % 10;
                    if(l == k)
                    {
                        ans++;
                        break;
                    }
                    sum /= 10;
                }
            }
        }
        cout << ans << endl;
    	return 0;//完结撒花
    }
    
    • @ 2023-3-9 17:51:36

      开玩笑,你TLE是写错了吧?

      这代码都AC。

      #include<iostream>
      
      using namespace std;
      
      bool pdzs(int n){
      	if(n<2){
      		return 0;
      	}
      	for(int i = 2; i * i <= n; i ++ ){
      		if(n%i == 0){
      			return 0;
      		}
      	}
      	return 1;
      }
      
      bool pdtj(int x,int y){
      	while(x != 0){
      		if(x%10==y){
      			return 1;
      		}
      		x/=10;
      	}
      	return 0;
      }
      
      int main(){
      	int n,m,x,ans = 0;
      	cin>>n>>m>>x;
      	for(int i = n; i <= m; i ++ ){
      		if(pdzs(i)&&pdtj(i,x)){
      			ans ++ ;
      		}
      	}
      	cout<<ans;
      	return 0;
      } 
      

信息

ID
975
时间
1000ms
内存
128MiB
难度
7
标签
递交数
404
已通过
106
上传者