dfs:水题-DFS-牛客+集合中的质数-(容斥+dfs)-牛客

时间:2020-08-08
本文章向大家介绍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;
}

原文地址:https://www.cnblogs.com/sweetlittlebaby/p/13460634.html