首页 > 其他分享 >2023杭电多校4

2023杭电多校4

时间:2024-10-10 23:21:14浏览次数:3  
标签:杭电多校 return int 2023 long ans include mod

2023杭电多校4

a-b Problem

题目大意:

每个物品都有 a , b a,b a,b 两个值, A l i c e Alice Alice 拿到该物品得到 a a a的分数, B o b Bob Bob 拿到该物品得到 b b b 的分数。

基本思路:

以 a + b a+b a+b 的值对物品排序,按顺序取即可

代码:
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<unordered_map>
#include<stack>
using namespace std;
#define int long long int 
#define Paddi ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define endl '\n'
struct Node 
{
    int a,b;
};
bool cmp(struct Node a,struct Node b)
{
    return a.a + a.b > b.a + b.b;
}
signed main()
{
    Paddi;
    int T;
    cin >> T;
    while(T--)
    {
        int n;
        cin >> n;
        vector<struct Node> s(n);
        for (int i = 0; i < n; i++)
            cin >> s[i].a >> s[i].b;
        sort(s.begin(), s.end(), cmp);
        int ans1 = 0, ans2 = 0;
        for (int i = 0; i < n; i++)
        {
            if (i % 2 == 0)
                ans1 += s[i].a;
            else
                ans2 += s[i].b;
        }
        cout << ans1 - ans2 << endl;
    }
    return 0;
}

Simple Tree Problem

题目大意:

你有 q q q 个集合,你可以在每个集合取一个数,求取得数最大值和最小值之差

基本思路:

对所有数进行排序之后,枚举右端点。对于某个右端点,我们要找到一个左端点使得这段区间内的数包含了所有的集合,考虑采用双指针,加入一个数后维护目前区间内涵盖所有集合的数量

代码:
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <unordered_map>
#include <stack>
#include <array>
#include <vector>
using namespace std;
int read()
{
    int x = 0, w = 1;
    char ch = 0;
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + (ch - '0');
        ch = getchar();
    }
    return x * w;
}
int main()
{
    int T;
    T = read();
    while (T--)
    {
        int q;
        q = read();
        vector<pair<int, int>> s;
        for (int i = 1; i <= q; i++)
        {
            int k;
            k = read();
            while (k--)
            {
                int x;
                x = read();
                s.push_back({x, i});
            }
        }
        sort(s.begin(), s.end());
        int cnt = q;
        int now = -1;
        vector<int> rec(q + 10, 0);
        int ans = 2e9;
        for (int i = 0; i < s.size(); i++)
        {
            pair<int, int> a = s[i];
            rec[a.second]++;
            if (now==-1)
            {
                if (rec[a.second] == 1)
                    cnt--;
                if(cnt==0)
                    now = 0;
            }
            if(now!=-1)
            {
            	while(rec[s[now].second]>1)
                	rec[s[now].second]--,now++;
            	ans = min(ans, a.first-s[now].first);
			}
        }
        printf("%d\n", ans);
    }
    return 0;
}

Kong Ming Qi

思维题

PSO

题目大意:

给你一张图,非 1 1 1 节点和节点 1 1 1 连一条边,求图上所有 ( i , j ) (i,j) (i,j)对的路径数学期望

思路:

特判 1 1 1,其他节点计算即可

代码:

#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <unordered_map>
#include <stack>
using namespace std;
#define int long long int
#define Paddi ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'

signed main()
{
    //Paddi;
    int T;
    cin >> T;
    while (T--)
    {
        double n;
        cin >> n;
        if (n == 2)
        {
            printf("%.9lf %.9lf\n", 1.0, 1.0);
        }
        else
        {
            double ans = ((2 * n - 3)*(n - 1) + (n - 1)) / ((n - 1) * n);
            printf("%.9lf %.9lf\n", ans, 2.0);
        }
    }
    return 0;
}

Guess

题目大意:

S ( n ) = ∑ d ∣ n μ ( n d ) ln ⁡ ( d ) S(n)=\sum_{d|n}\mu({n \over d}) \ln(d) S(n)=d∣n∑​μ(dn​)ln(d)

e s ( n ) e^{s(n)} es(n)

基本思路:

将公式转化为
∏ d ∣ n d μ ( n d ) \prod_{d|n} d^{\mu({n\over d})} d∣n∏​dμ(dn​)
打表发现当 n = p k , p ∈ P r i m e n=p^k,p\in Prime n=pk,p∈Prime,答案为 p p p,否则答案为 1 1 1.

我们判断 n n n 是否为质数,若是质数,直接输出

若不是质数,我们枚举 k k k,通过二分找到可能的 p p p,判断 p p p是否为质数

代码:
#include <bits/stdc++.h>

using namespace std;
#define int long long int
const int Mod = 998244353;
#define Paddi ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
int ri[70] = {
    0,
    0,
    1000000000,
    1000000,
    31622,
    3981,
    1000,
    372,
    177,
    100,
    63,
    43,
    31,
    24,
    19,
    15,
    13,
    11,
    10,
    8,
    7,
    7,
    6,
    6,
    5,
    5,
    4,
    4,
    4,
    4,
    3,
    3,
    3,
    3,
    3,
    3,
    3,
    3,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    1,
    1,
    1,
    1,
    1,
};
int qpow(int a, int b, int mod)
{
    int ans = 1;
    while (b)
    {
        if (b & 1ll)
            ans = ans * a % mod;
        b >>= 1;
        a = a * a % mod;
    }
    return ans;
}
int mpow(int a, int b)
{
    int ans = 1;
    for (int i = 1; i <= b; i++)
        ans *= a;
    return ans;
}
long long quick_pow(long long x, long long p, long long mod)
{ 
    long long ans = 1;
    while (p)
    {
        if (p & 1)
            ans = (__int128)ans * x % mod;
        x = (__int128)x * x % mod;
        p >>= 1;
    }
    return ans;
}
bool Miller_Rabin(long long p)
{ 
    if (p < 2)
        return 0;
    if (p == 2)
        return 1;
    if (p == 3)
        return 1;
    long long d = p - 1, r = 0;
    while (!(d & 1))
        ++r, d >>= 1;
    for (long long k = 0; k < 10; ++k)
    {
        long long a = rand() % (p - 2) + 2;
        long long x = quick_pow(a, d, p);
        if (x == 1 || x == p - 1)
            continue;
        for (int i = 0; i < r - 1; ++i)
        {
            x = (__int128)x * x % p;
            if (x == p - 1)
                break;
        }
        if (x != p - 1)
            return 0;
    }
    return 1;
}

int msqrt(int n, int k)
{
    int l = 1, r = ri[k], ans = 1;
    while (l <= r)
    {
        int mid = (l + r) >> 1;
        if (mpow(mid, k) <= n)
            ans = mid, l = mid + 1;
        else
            r = mid - 1;
    }
    return ans;
}
bool isp(int x)
{
    for (int i = 2; i * i <= x; i++)
    {
        if (x % i == 0)
            return false;
    }
    return true;
}
signed main()
{

    int T;
    cin >> T;
    srand(time(NULL));
    while (T--)
    {
        int n;
        cin >> n;
        if (n == 1)
        {
            cout << 1 << ' ';
            continue;
        }

        if (Miller_Rabin(n))
        {
            cout << n % Mod << " ";
            continue;
        }
        else
        {
            int ans = 1;
            for (int i = 2; i <= 64; i++)
            {
                int t = msqrt(n, i);
                if ((mpow(t, i) == n) and (isp(t)))
                {
                    ans = t;
                    break;
                }
            }
            cout << ans % Mod << " ";
        }
    }
    return 0;
}

Data Generation

题目大意:

给你一个排列,最初的状态 a i = i a_i=i ai​=i,你有 m m m次的 s w a p swap swap操作,求 a i ≠ i a_i \neq i ai​=i的期望

基本思路:

对于整个排列来说, a j = j a_j=j aj​=j,的概率就是整个排列中 a i = i a_i=i ai​=i 的概率,我们只考虑某个位置 j j j,在进行 k k k 次操作后 a j = j a_j=j aj​=j的期望为 E k E_k Ek​

则我们有
E k + 1 = ( n − 1 ) 2 + 1 n 2 E k + 2 n − 2 n 2 n − 1 2 n − 2 ( 1 − E k ) = ( n − 1 ) 2 + 1 n 2 E k + n − 1 n 2 ( 1 − E k ) E k = n − 2 n E k + 2 n 2 E_{k+1}= \frac{(n-1)^2 +1}{n^2} E_k+\frac{2n-2}{n^2} \frac{n-1}{2n-2} (1-E_k)=\frac{(n-1)^2 +1}{n^2} E_k+\frac{n-1}{n^2} (1-E_k)\\ E_k=\frac{n-2}{n} E_k+\frac{2}{n^2} Ek+1​=n2(n−1)2+1​Ek​+n22n−2​2n−2n−1​(1−Ek​)=n2(n−1)2+1​Ek​+n2n−1​(1−Ek​)Ek​=nn−2​Ek​+n22​

n − 2 n = a , 2 n 2 = b \frac{n-2}{n}=a,\frac{2}{n^2}=b nn−2​=a,n22​=b
得到
E k = a k + b ( a k − 1 + a k − 2 + ⋯ + a 0 ) = a k + b ( 1 − a k 1 − a ) E_k=a^k+b(a^{k-1}+a_{k-2}+\dots+a^{0})=a^k+b(\frac{1-a^{k}}{1-a}) Ek​=ak+b(ak−1+ak−2​+⋯+a0)=ak+b(1−a1−ak​)

代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define Paddi ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int mod = 998244353;
int qpow(int a, int b)
{
    int ans = 1;
    while (b)
    {
        if (b & 1)
            ans = ans * a % mod;
        b >>= 1;
        a = a * a % mod;
    }
    return ans % mod;
}
signed main()
{
    Paddi;
    int T;
    cin >> T;
    while (T--)
    {
        int n, m;
        cin >> n >> m;
        n%=mod;
        int invn = qpow(n, mod - 2);
        int a = ((n - 2 + mod) % mod);
        a = a * invn % mod;
        a = qpow(a, m);
        int t1 = (1 - a + mod) % mod;
        t1 = t1 * invn % mod;
        t1 = (t1 + a) % mod;
        int ans = (1 - t1 + mod) % mod;
        ans = (ans * (n % mod)) % mod;
        cout << ans << endl;
    }
    return 0;
}

标签:杭电多校,return,int,2023,long,ans,include,mod
From: https://blog.csdn.net/2302_80542709/article/details/142834548

相关文章

  • 2023 年和 2024 年最具威胁的 25 种安全漏洞(CWE Top 25)
    目录1.缓冲区溢出(CWE-120)2.代码注入(CWE-94)3.认证缺失(CWE-287)4.访问控制缺失(CWE-284)5.SQL注入(CWE-89)6.跨站脚本(XSS)(CWE-79)7.不安全的反序列化(CWE-502)8.脆弱的随机数生成(CWE-331)9.信息泄露(CWE-200)10.不安全的直接对象引用(CWE-63......
  • 10.10 爆零赛(2023 炼石计划 NOIP 模拟赛 #2)
    炼石计划9月10日NOIP模拟赛#2【补题】-比赛-梦熊联盟(mna.wang)模拟赛恒等式:\(0+0+0+0=0\)。复盘T1好像可做。有个显然的\(n^2\)DP。推式子的时候猜到了\(\gcd=1\)的做法。进一步尝试正解未果。T2一眼只会爆搜。想到了\(b\timesb!\)的做法,应该能过\(......
  • 【题解】2023传智杯全国大学生程序设计竞赛-初赛第一场
    A.字符串拼接直接拼接两个字符串即可,注意的是字符串可能包含空格,因此需要使用getline函数进行输入。#include<bits/stdc++.h>usingnamespacestd;intmain(){strings1,s2;getline(cin,s1);getline(cin,s2);cout<<s1+s2<<endl;return0......
  • The 2023 ICPC Asia Hangzhou Regional Contest (The 2nd Universal Cup. Stage 22: H
    The2023ICPCAsiaHangzhouRegionalContest(The2ndUniversalCup.Stage22:Hangzhou)M.V-Diagram题意:给定一个“v图”,求平均值最大的子"v图"思路:原图的最低点以及左右两个点必须取,如何先取满左边或者右边在贪心即可voidsolve(){lln;cin>>n;vect......
  • 2023牛客OI赛前集训营-提高组(第三场) - 题解汇总
    空位与数(game)贪心即可,因为正正得正,负负也得正,所以将两个数组分别按照正负性分开,然后让正数里面大的配上大的,负数里面绝对值大的配上绝对值大的,这样可以让正积总和尽量大。剩下不足的(必须要一正一负相乘的)让绝对值大的配绝对值小的,这样可以让负积总和尽量小。#include<cstdio>#i......
  • 10.8 模拟赛(2023 CSP-S 十连测 #5)
    炼石计划10月28日CSP-S十连测#5【补题】-比赛-梦熊联盟(mna.wang)复盘T1秒了。30min。T2题目越短越难。但是链的是经典题目,写了。小样例太水,大样例太大,不方便猜结论。于是先写暴力然后自己造样例。模拟了五六组感觉可以按照lca的深度降序排序,然后能选就选。这......
  • 2023 ICPC 南京
    10.5想要袋鼠。赛时5题深刻感觉到代码能力瓶颈。I签到C也是签到,需要枚举的次数很少。F似乎是签到但是队友debug卡了一百年,晚点补一下看看Gxixike秒的L思路就是贪心。我写了两遍错的,xixike重构了一下把能合并的都合并了就过了。A比较显然的是连通块里面的袋鼠都胜......
  • 最新整理-全国及各城市POI数据(2023年含七大主要城市数据)
    文章目录数据下载地址数据指标说明一、全国范围2012、2014、2016、2018、2020、2022年常用POI数据集二、全国各城市POI兴趣点数据三、2023年七大主要城市POI数据项目备注数据下载地址数据下载地址点击这里下载数据数据指标说明POI(一般作为PointofInterest的缩写......
  • Matrix Distances(ICPC2023 合肥站)
    #include<bits/stdc++.h>#defineendl'\n'#defineintllusingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("in.txt","rt",stdi......
  • [NOIP2023] 双序列拓展 题解
    qaq首先我们考虑其实这个条件就是要满足\(f\)严格比\(g\)大或\(f\)严格比\(g\)小。在这里只讨论大于。然后考虑到对于一个\(i\)如果不满足,我们可以把对应数组向右移一位看是否满足,如果还是不满足就无解了。考虑对于现在满足的\(i\),我们可以分别把两个指针向右移一......