1,斐波那契数,递推
2,皇后数打表
3,进制转换
#include<bits/stdc++.h> /*#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<cmath> #include<iomanip> #include<queue> #include<cstring>*/ using namespace std; 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; }