MnZn实在是调不动了,求dalao帮忙,悬赏关注
查看原帖
MnZn实在是调不动了,求dalao帮忙,悬赏关注
258178
Benzenesir楼主2023/3/10 21:52
#include <iostream>
#include <algorithm> 
#define int long long

using namespace std;

const int maxN=1000;
int n,p;
int f[300][300],f1[300][300],f2[300][300];
struct node{
	int st,mx;
}a[maxN];

void prepare(){
	for(int i=1;i<n;++i){
		int c=i+1;
		for(int j=2;j<=22;++j){
			if(c%j==0){
				a[i].st|=(1<<(j-1));//小质数的集合 
				while(c%j==0) c/=j;
			}
		}
		cout << a[i].st << endl;
		a[i].mx = c; 
	}
}

bool operator < (node x,node y) {
	return x.mx >y.mx ;
}

inline int add(int x,int y){
	long long 	q=x+y;
	if(q>=p) q-=p;
	return (int) q; 
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0); 
	cin >> n >> p;
	prepare();
	sort(a+1,a+n);
	//for(int i=1;i<n;++i) cout << a[i].st << " ";
	f[0][0]=1;
	for(int i=1;i<n;++i){
		if(i==1||a[i].mx !=a[i-1].mx||a[i].mx ==1){
			memcpy(f1,f,sizeof(f));
			memcpy(f2,f,sizeof(f));
		}
		for(int k=255;k>=0;--k){
			for(int j=255;j>=0;--j){
				if(j&k) continue ;
				if((k&a[i].st)==0)
					f1[j|a[i].st][k]=add(f1[j|a[i].st][k],f1[j][k]);
				if((j&a[i].st)==0)
					f2[j][k|a[i].st]=add(f2[j][k|a[i].st],f2[j][k]);
			}
		}
		if(i==n-1||a[i].mx!=a[i-1].mx||a[i].mx==1){
			for(int k=255;k>=0;--k){
				for(int j=255;j>=0;--j){
					if((j&k)==0){
						f[j][k]=add(add(f1[j][k],f2[j][k]),p-f[j][k]);
					}
				}
			}
		}
		
	}
	
	int ans=0;
	for(int i=0;i<=255;++i){
		for(int j=0;j<=255;++j){
			if((i&j)==0) {
				ans=add(ans,f[i][j]);
			}
		}
	}
	cout << ans << endl;
	
	
	
	
	
	return 0;
} 
2023/3/10 21:52
加载中...