河南萌新联赛2024第(一)场:河南农业大学

1.D-小蓝的二进制询问

原题链接:

https://ac.nowcoder.com/acm/contest/86639/D

我们列举一些二进制数,发现在第一位永远是0 1的循环,第二位是0 0 1 1的循环。。。第n位也是如此,所以可以得出每位上的循环节是2k ,且前一半的数都是0。每次在计算某数时的1的总个数可以计算他是循环节的几倍,乘以循环节的一半,再加上余数减去前面的0个数后的数,所得即所求。

 

查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 4e5 + 7;
const int mod = 998244353;
int f(int x, int k)
{
    int y = 1ll << (k );//这里一定要把1强制类型转换,不然会有误差
    int ok = y / 2;
    x++;//加上0这个数,方便算倍数
    int res=x/y*ok;
    int yu = x % y;
    yu -= ok;
    if (yu > 0)
        res += yu;
    return res;
}
void solve()
{
    int l, r;
    cin >> l >> r;
    int ans = 0;
    for (int i = 62; i >= 1; i--)
    {//枚举每个数位
        int p = (f(r, i) % mod - f(l - 1, i) % mod + mod) % mod;
        ans = (ans + p) % mod;
    }
    cout << ans << endl;
}
signed main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

2.C-有大家喜欢的零食么

原题链接:

https://ac.nowcoder.com/acm/contest/86639/C

在此推荐一个大佬博客:https://blog.csdn.net/u011815404/article/details/84260940

二分图最大匹配匈牙利算法模板题

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
vector<int> G[10001];
int sign[100000],jie[100000];
bool dfs(int x)
{
    for(int i=0;i<G[x].size();i++)
    {
        int f=G[x][i];
        if(!sign[f])
        {
            sign[f]=1;
            if(jie[f]==0||dfs(jie[f]))
            {
                jie[f]=x;
                return true;
            }
        }
    }
    return false;
}
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int t;
        cin>>t;
        while(t--)
        {
            int x;
            cin>>x;
            G[i].push_back(x);
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        memset(sign,0,sizeof sign);
        if(dfs(i))ans++;
    }
    if(ans==n)cout<<"Yes";
    else
    {
        cout<<"No"<<endl;
        cout<<n-ans;
    }
    return 0;
}
posted @ 2024-07-18 10:10  伊芙加登  阅读(36)  评论(0)    收藏  举报