题目链接如下
打表可得规律: sgi=log2(lowbit(i))。
然后枚举所有可能,时间复杂度:O(nm)。
然后这只貌似能过 n,m<=8的数据。
老师说用一个简单的 DP 即可过 n,m<=52501 的数据。
然后倍增DP可过 n,m<=1018 的数据。
在此求助DP和倍增DP该怎么写?
本人的暴力代码:
#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
int sg[100001];
int n,m;
unsigned long long ans=0;
int SG(int x){return log2(x&(-x));}
void dfs(int num,int k,int x){
if(num==m){
if(x)ans++,ans%=mod;
return;
}
for(int i=1;i<=n;i++){
dfs(num+1,i,x^sg[i]);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)sg[i]=SG(i);
dfs(0,1,sg[0]);
cout<<ans%mod;
return 0;
}