1. 程式人生 > 實用技巧 >dfs:水題-DFS-牛客+集合中的質數-(容斥+dfs)-牛客

dfs:水題-DFS-牛客+集合中的質數-(容斥+dfs)-牛客

水題-DFS-牛客

解:斐波那契數的另一種表述,暴力做,好像不用DFS;

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的階乘在m進位制下末尾0的個數

集合中的質數-(容斥+dfs)-牛客

題意:給出一個集合和一個數m。

集合裡面有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;
}