这份代码无氧能过,开了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;
}