题解:P2429 制杖题
这题其实不太制杖吧
主要思路
首先
状压枚举
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=376544743;
ll n,m,p[39],pro,ans,f;
int main(){
cin>>n>>m; for(int i=1;i<=n;i++) cin>>p[i];
for(int i=1;i<(1<<n);i++){
f=-1; pro=1;
for(int j=1;j<=n;j++){
if(i&(1<<(j-1))){
f*=-1; pro*=p[j]; if(pro>m) break;
}
}
ans+=f*(m/pro*(m/pro+1)/2%mod*pro%mod)%mod; ans%=mod;
}
cout<<ans<<endl;
return 0;
}
提交发现 TLE #1,2,3,疑似是因为 #1,2,3
考虑优化。注意到
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=376544743;
ll n,m,p[39],ans;
void dfs(ll num,ll f,ll pro){
if(num==n+1){
if(pro==1) return;
ans+=f*(m/pro*(m/pro+1)/2%mod*pro%mod)%mod; ans%=mod; return;
}
dfs(num+1,f,pro);
if(pro*p[num]<=m) dfs(num+1,-f,pro*p[num]);
}
int main(){
cin>>n>>m; for(int i=1;i<=n;i++) cin>>p[i];
dfs(1,-1,1); cout<<ans<<endl;
return 0;
}