首页 > 其他分享 >2023 Hubei Provincial Collegiate Programming Contest

2023 Hubei Provincial Collegiate Programming Contest

时间:2023-05-19 20:48:23浏览次数:39  
标签:Provincial cout Contest int nullptr Programming cin long tie

C. Darkness I

首先根据短边放一条对角线,然后往后每隔一列只放一个即可。

#include <bits/stdc++.h>

using namespace std;

#define int long long


int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int n, m;
    cin >> n >> m;
    cout << (n + m + 1) / 2;
    return 0;
}

H. Binary Craziness

因为是树的关系,度数的种类并不会太多,直接枚举度数就好了。

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int mod = 998244353;

int32_t main(){
	ios::sync_with_stdio(false) , cin.tie(nullptr) , cout.tie(nullptr);
	int n , m ;
	cin >> n >> m;
	vector<int> deg( n + 1 );
	for( int x , y ; m ; m -- ){
		cin >> x >> y;
		deg[x] ++ , deg[y] ++;
	}
	unordered_map<int,int> cnt;
	for( int i = 1 ; i <= n ; i ++ )
		cnt[ deg[i] ] ++;
	int res = 0;
	vector<int> a , b;
	for( const auto &[ x , y ] : cnt ) a.push_back(x) , b.push_back(y);
	
	for( int i = 0 ; i < a.size() ; i ++ )
		for( int j = i+1 ; j < a.size() ; j ++ ){
			(res += (a[i] ^ a[j])*(a[i] | a[j])%mod*(a[i] & a[j])%mod*b[i]%mod*b[j]%mod)%=mod;
		}
	cout << res <<"\n";
	return 0;
}

I. Step

首先\(lcm(p_1,\cdots,p_n)\)的倍数天一定可以回到\(1\)。前\(i\)天累计移动\(\frac{i(i+1)}{2}\)步,所以要寻找最小的\(i\)满足\(\frac{i(i+1)}{2} = k\times lcm\)

可以变形为\(i(i+1)=k(2lcm)\),把\(2lcm\)进行质因数分解,可以估算出质因子的数目不超过20 个,因为相邻数互质,每一个数只能属于\(i\)或\(i+1\)中的一个。所以可以通过二进制枚举的形式,设属于\(i\)的质因子乘积为\(y\),属于\(i+1\)的质因子乘积为\(x\)。同理也可以吧\(k\)质因数分解,然后分给\(i+1\)乘积为\(a\),分给\(i\)的乘积是\(b\)。所以可以得到\(ax-by=1\),用扩展欧几里得借一下方程就好了。

#include <bits/stdc++.h>
using namespace std;

#define int long long


int power( int x , int y ){
    int ans = 1;
    while( y ){
        if( y & 1 ) ans = ans * x;
        y >>= 1 , x = x * x;
    }
    return ans;
}


int exgcd( int a , int b , int & x , int & y ){
    if( b == 0 ) { x = 1 , y = 0 ; return a;}
    int d = exgcd( b , a%b , x , y );
    int z = x ; x = y ; y = z - y * (a / b);
    return d;
}


int32_t main(){
    ios::sync_with_stdio(false) , cin.tie(nullptr) , cout.tie(nullptr);
    int n;
    cin >> n;

    unordered_map<int,int> prime;

    for( int i = 1 , x ; i <= n ; i ++ ){
        cin >> x;
        for( int j = 2 , cnt ; j*j <= x; j ++ ){
            if( x % j == 0 ){
                cnt = 0;
                while( x % j == 0 ) x /= j , cnt ++;
                prime[j] = max( prime[j] , cnt );
            }
        }
        if( x > 1 ) prime[x] = max( prime[x] , 1ll );
    }

    vector<int> a;
    prime[2] ++;
    for( const auto & [ x , y ] : prime )
        a.push_back( power( x , y ) );

    int res = LLONG_MAX;

    for( int i = 0 , m = (1ll<<a.size())-1 , x , y , t ; i <= m ; i ++ ){
        x = y = 1 , t = i;
        for( int j = 0 ; j < a.size() ; j ++ , t >>= 1){
            if( t & 1 ) x *= a[j];
            else y *= a[j];
        }
        int kx , ky , d ;

        d = exgcd( x , -y , kx , ky );
        if( kx && ky && d ) res = min( res , ky * y) ;
    }
    cout << res;

    return 0;
}

F. Inverse Manacher

找到枚举|的位置,如果f[i]=1所有左右两侧的字母不同。固定第一个字母,然后根据这个规律构造即可

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int mod = 998244353;


int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int n, m;
    cin >> n, m = n * 2 + 2;
    vector<int> a(m+1);
    for( int i = 1 ; i <= m ; i ++ ) cin >> a[i];
    cout << "a";
    for( int i = 4 , t = 0 ; i < m ; i += 2 ){
        if( a[i] == 1 ) t ^= 1;
        cout << "ab"[t];
    }
    return 0;
}

J. Expansion

贪心吧。维护一下前缀和中的最大值,如果过不去了就在最大值处多停留几次。

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int mod = 998244353;


int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int n, res = 0;
    cin >> n;
    for (int i = 1, x, sum = 0, large = 0, cnt = 0, p; i <= n; i++) {
        cin >> x;

        sum += x;
        if (sum < 0 && (i == n || i == 1)) {
            cout << "-1\n";
            return 0;
        }
        large = max(large, sum);
        if (cnt + sum >= 0) {
            res++;
            cnt += sum;
        } else {
            p = -cnt - sum;
            if (large == 0) {
                cout << "-1\n";
                return 0;
            }
            p = (p + large - 1) / large;
            cnt += large * p + sum;
            res += p + 1;
        }
    }
    cout << res;
    return 0;
}

K. Dice Game

对于\([2,n+1]\)号人对游戏的贡献是相同的,所以单独考虑即可。如果1号要输,则必须输给所有的人。

对于1号,当他固定投出\(i\)的时候,2 号和他平局的概率是\(\frac{1}{m}\),2 号获胜的概率是\(\frac{m-i}{m}\),所以2号在第\(x\)局获胜的概率是\(\frac{m-i}{m^x}\),所以2 号获胜的概率是\(\sum_{x=1}^{+\infty}\frac{m-i}{m^x}=\frac{m-x}{m-1}\)。所以\(n\)个人获胜的概率是\((\frac{m-i}{m-1})^n\)。

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int mod = 998244353;

int power( int x , int y ){
	int ans = 1;
	while( y ){
		if( y & 1 ) ans = ans * x % mod;
		y >>= 1 , x = x * x % mod;
	}
	return ans;
}

int inv( int x ){
	return power( x , mod - 2 );
}

int32_t main(){
	ios::sync_with_stdio(false) , cin.tie(nullptr) , cout.tie(nullptr);
	int n , m ;
	cin >> n >> m;
	
	int invs = inv( m-1 );
	for( int i = 1 ; i <= m ; i ++ ){
		cout << power((m-i) * invs%mod , n ) << " ";
	}
	return 0;
}

M. Different Billing

鸡兔同笼?枚举一下就好了。

#include <bits/stdc++.h>

using namespace std;

#define int long long


int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int x , y;
    cin >> x >> y;
    for( int a , b = 0 , c ; b <= x ; b ++ ){
        c = y - b * 1000;
        if( c % 2500 ) continue;
        c /= 2500 , a = x - b - c;
        if( a < 0 || c < 0 ) continue;
        cout << a << " " << b << " " << c;
        return 0;
    }
    cout << "-1\n";
    return 0;
}

标签:Provincial,cout,Contest,int,nullptr,Programming,cin,long,tie
From: https://www.cnblogs.com/PHarr/p/17416218.html

相关文章

  • 2023 CCPC Henan Provincial Collegiate Programming Contest
    A.小水獭游河南a的长度小于26,所以直接暴力枚举暴力判断。#include<bits/stdc++.h>usingnamespacestd;voidsolve(){strings;cin>>s;if(s.size()==1){cout<<"NaN\n";return;}map<char,int>cnt;......
  • AtCoder Regular Contest 133 E Cyclic Medians
    洛谷传送门AtCoder传送门其实是套路题,但是为什么做不出来啊第一步就是经典套路。枚举\(k\),统计中位数\(>k\)的方案数,加起来就是中位数的总和。那么现在\(x_{1\simn},y_{1\simm}\)就变成了\(0/1\)序列,考虑一次操作,如果\((x,y)=(0,0)\),那么\(a\)会变成\(0\)......
  • AtCoder Regular Contest 124 F Chance Meeting
    洛谷传送门AtCoder传送门感觉挺高妙的……为了方便,不妨把横纵坐标都整体减\(1\)。如果单独考虑上下移动,方案数是\(\binom{2n}{n}\)。发现两个人上下总共移动\(n\)次后一定会在同一行,设这行编号为\(x\),那么最后带个\(\binom{n}{x}^2\)的系数,并且除掉上下移动后方案本质......
  • AtCoder Beginner Contest 212 F Greedy Takahashi
    洛谷传送门AtCoder传送门考虑每条边,因为是静态的,所以可以预处理出\(f_{i,j},g_{i,j}\)表示从第\(i\)条边,往后跳\(2^j\)条边,跳到边的编号和目前的时间(如果不存在就当作跳到第\(0\)条边)。直接倍增处理即可。询问就是找到从\(u\)开始的出边,能跳尽量跳。注意一些细节......
  • CF1077E Thematic Contests 题解
    ThematicContests题意有\(n\)个问题,每个问题有一个分类\(a_i\)。现在要举办一些比赛,要求:一场比赛中所有题目的分类相同。所有比赛的分类是互不相同的。第一场比赛的题目数量任意,但从第二场开始,每一场比赛的题目数量都必须是前一场的两倍。求所有比赛的题目数量之和的......
  • AtCoder Beginner Contest 253(E,F)
    AtCoderBeginnerContest253(E,F)E(dp,前缀和)E大意就是求满足以下要求的的序列的个数\(1\),满足\(a_i\)都在\([1,m]\)的范围里面\(2\),满足$\verta_i-a_{i+1}\vert$大于\(k\)之前做过一个类似的题目,是绝对值小于\(k\),不过大同小异这里我使用了前缀和来优化但是这里......
  • AtCoder Beginner Contest 200 F Minflip Summation
    洛谷传送门AtCoder传送门显然的策略:选择全部\(0\)段变成\(1\),或选择全部\(1\)段变成\(0\)。归纳可得一般性的结论:设字符串中\(s_i\nes_{i+1}\)的位置数为\(k\),答案为\(\left\lceil\frac{k}{2}\right\rceil\)。因为在模意义下不能上取整,考虑记\(k\)的奇偶性(这样......
  • CS106L: Standard C++ Programming, Special Edition
    课程内容涉及C++五大主题:C++介绍、Stream和Types、STL四大模块、OOP面向对象、高级特性(RAII、多线程、元编程)。本系列整合了CS106L课程公开的资料,系统完整的涵盖了C++核心内容,方便学习。搭配《C++Primer》,一起享用更佳!C++课程自学总结CS106L学习时间:刷课一周,复......
  • SAP UI5 Flexible Programming Model Explorer
    按照SAPUI5官网的说法,TheSAPUI5freestyletemplatesaredeprecated,andit’srecommendedtousethecustompageSAPFioritemplatebasedontheflexibleprogrammingmodelasanalternative.Formoreinformation,seeFlexibleProgrammingModelInformation......
  • AtCoder Regular Contest 160 D Mahjong
    洛谷传送门AtCoder传送门搞笑题,我不会做,我更搞笑。考虑逆序操作,即初始有一个全\(0\)序列,每次单点加\(k\)或者长为\(k\)区间加\(1\)。考虑把一个操作集合唯一对应到一个最终序列,不难发现只要限制每个区间加\(1\)的次数\(<k\)即可。因为如果正序操作,加上了限制,每个......