dfs:水題-DFS-牛客+集合中的質數-(容斥+dfs)-牛客
阿新 • • 發佈:2020-08-09
1,斐波那契數,遞推
2,皇后數打表
3,進位制轉換
#include<bits/stdc++.h> /*#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<cmath> #include<iomanip> #include<queue> #include<cstring>*/ using namespacestd; const int maxn=100; const int mod=19260817; const int inf=0x3f3f3f3f; typedef long long ll; typedef pair<int,int> pii; const int N=5e5+10; ll x; int m; int ans[]={0,1,0,0,2,10,4,40,92,352,724,2680,14200,73712}; ll f[maxn]; void solve() { ll res=1e18; for(int i=2; i<=m; i++) {int cnt=0; while(m%i==0) { cnt++; m/=i; } if(cnt) { ll n=x,sum=0; while(n) { sum+=n/i; n/=i; } res=min(res,sum/cnt); } } cout<<res<<endl; }int main() { cin>>x>>m; f[1]=f[2]=1; for(int i=3; i<maxn; i++) f[i]=f[i-1]+f[i-2]; int flag=0; for(int i=1; i<maxn; i++) { if(x==f[i]) { flag=1; solve(); break; } } int z=x%min(13,m)+1; if(!flag) cout<<ans[z]<<endl;; system("pause"); return 0; }
集合裡面有n個質數。
請你求出從 1 到 m 的所有數中,至少能被集合中的一個數整除的數的個數。
解:容斥,搜尋一下
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int mod=19260817; const int inf=0x3f3f3f3f; typedef long long ll; typedef pair<int,int> pii; const int N=5e5+10; int n,m; ll a[30]; ll ans; void dfs(ll step,ll state,ll cnt) { if(step==n) { if(!cnt) return ; else{//容斥 if(cnt&1) ans+=m/state; else ans-=m/state; } return ; } dfs(step+1,state*a[step+1],cnt+1);//選 dfs(step+1,state,cnt);//不選 return ; } int main() { cin>>n>>m; for(int i=1; i<=n; i++) cin>>a[i]; dfs(0,1,0); cout<<ans<<endl; system("pause"); return 0; }
領:
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int mod=19260817; const int inf=0x3f3f3f3f; typedef long long ll; typedef pair<int,int> pii; const int N=5e5+10; int n,m; ll a[30]; ll ans; void dfs(int p, int f, ll cur) {//遞迴列舉除數 if (p == n) return;//如果遞迴到頭了 if (cur * a[p] <= m) {//如果還可以繼續下去 ans += m / (a[p] * cur) * f; dfs(p + 1, -f, cur * a[p]); dfs(p + 1, f, cur); } } int main() { cin >> n >> m; for (int i = 0; i < n; i++) cin >> a[i]; sort(a, a + n);//排序,優先選擇小的 dfs(0, 1, 1); cout << ans << endl; return 0; }