线性筛会MLE吗?
查看原帖
线性筛会MLE吗?
461671
LumenOvO楼主2021/8/21 16:27
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define endl '\n'
const double PI = acos(-1.0);
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int modn = 1e9;
const int N = 1e8;
bool vis[25];
int a[25];
int n,k;
int ans=0;
int prime[N];//最小素因子
int visit[N];//素数
void Prime(){
    for (int i = 2;i <= N; i++) {
        if (!visit[i]) {
            prime[++prime[0]] = i;      //纪录素数, 这个prime[0] 相当于 cnt,用来计数
        }
        for (int j = 1; j <=prime[0] && i*prime[j] <= N; j++) {
            visit[i*prime[j]] = 1;
            if (i % prime[j] == 0) { //只需筛最小素因子
                break;
            }
        }
    }
}
void dfs(int x,int se,int sum){
    if(se==k){
        if(!visit[sum]){
            ans++;
            return;
        }
    }
    for(int i=x;i<n;i++){
        if(!vis[i]){
            vis[i]= true;
            dfs(i,se+1,sum+a[i]);
            vis[i] = false;
        }
    }
}
void solve(){
    Prime();
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    //vis[0]= true;
    dfs(0,0,0);
    cout<<ans<<endl;
}
signed main(){
    //ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int _=1;
    //cin>>_;
    //getchar();
    while(_--){
        solve();
    }
    return 0;
}

以上是线性筛版本的代码,dfs主体没变就变了个判断素数。。然后我发现用普通的判断素数是可以ac的,但是用线性筛就mle了,有大佬分析一下吗0.0

2021/8/21 16:27
加载中...