关于厌氧。
查看原帖
关于厌氧。
696967
int_Hello_world楼主2023/5/5 16:55

这份代码无氧能过,开了O2会TLE。

主要原因是什么?memcpy吗?

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
	int x=0,f=0;char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) f|=(ch=='-');
    for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
	return f?-x:x;
}
void print(int x) {
	if(x<0) putchar('-'),x=-x;
	if(x>9) print(x/10);
	putchar(x%10+48);
}
const int N=255;
int zhi[8]={2,3,5,7,11,13,17,19};
int n,cnt,p,ans;
int dp[555][555],dp1[555][555],dp2[555][555];
struct node{
	int z,s,da;
}e[555];
bool cmp(node a,node b) {
	return a.da<b.da;
}
int ss(int x) {
    int y=x;
    e[x].z=x;
    for (int i=0;i<8;++i) {
    	if (y%zhi[i]==0) {
    		e[x].s|=(1<<i);
    		while(y%zhi[i]==0) y/=zhi[i];
		}
	}
	if(y^1) e[x].da=y;
}
signed main(){
    n=read(); p=read();
    for (int i=2;i<=n;++i) {
    	ss(i);
	}
    sort(e+2,e+n+1,cmp);
    dp[0][0]=1;
    for (int i=2;i<=n;++i) {
        if (e[i].da^e[i-1].da||!e[i].da) {
        	memcpy(dp1,dp,sizeof(dp1));
        	memcpy(dp2,dp,sizeof(dp2));
		}
		for (int x=N;x>=0;--x) {
			for (int y=N;y>=0;--y) {
				if (x&y) continue;
				if ((e[i].s&x)==0) {
					dp1[x][y|e[i].s]+=dp1[x][y];
					dp1[x][y|e[i].s]%=p;
				}
				if ((e[i].s&y)==0) {
					dp2[x|e[i].s][y]+=dp2[x][y];
					dp2[x|e[i].s][y]%=p;
				}
			}
		}
		if (e[i].da^e[i+1].da||!e[i].da||i==n) {
			for (int j=0;j<=N;++j) {
				for (int k=0;k<=N;++k) {
					if (j&k) continue;
					dp[j][k]=(dp1[j][k]+dp2[j][k]-dp[j][k]+p)%p;
				}
			}
		}
	}
	for (int i=0;i<=N;++i) {
		for (int j=0;j<=N;++j) {
			if (i&j) continue;
			ans+=dp[i][j];
			ans%=p;
		}
	}
	cout<<ans;
	return 0;
}

2023/5/5 16:55
加载中...