首页 > 其他分享 >河北省赛HBCPC2022补题

河北省赛HBCPC2022补题

时间:2022-10-30 10:47:09浏览次数:42  
标签:return 河北省 long int 补题 ans lld HBCPC2022 mod

赛时过了4道,D、H签到,F题贪心莫名卡了很久,M题用了线段树莫名过了,正解应该是用贡献度(But想不出来),赛后发现B题思路完全正确,就是没有时间写了:(,I题字符串也是一道简单dp(可惜看不出来

B_生日蛋糕

题意

对于给定的n,f[n]表示n被1到n-1整除后出现的整数种数,最后对T次询问,输出1-n的f[n]之和、

注意n可以取到1e9,结果对1e9+7取模。

思路

打表找规律,f[n] = 1,2,2,3,3,4,4,4,5,5,5,6,6,6,6……非常的明显,对于f[n],其所出现的次数就是f[n]/2+1,因为这里n非常大,没有办法直接初始化,所以可以用结构体初始化,然后再二分查找n所对应的结构体。

代码

#include <bits/stdc++.h>
using namespace std;
#define maxn 1000001
const long long mod = 1e9 + 7;

struct node {
	long long l, r;
	long long num;

} s[100001];
long long sum[100001];

void qaq() {
	for (int i = 1; i <= 100001; i++) {
		if (i == 1) {
			s[i].l = 1;
			s[i].r = 1;
			s[i].num = 1;
			sum[i] = s[i].num;
		} else {
			s[i].l = s[i - 1].r + 1;
			s[i].r = s[i].l + i / 2;
			s[i].num = i / 2 + 1;
			sum[i] = (s[i].num * i % mod + sum[i - 1] % mod) % mod;
		}
	};
}

int check(int x, long long n) {
	if (s[x].l <= n && s[x].r >= n) {
		return x;
	} else if (s[x].l > n) {
		return -1;
	} else  {
		return -2;
	}
}

int find(long long n) {
	int l = 1, r = 100001, mid = (l + r) / 2;
	int t = -3;
	while (t < 0) {
		t = check(mid, n);
		if (t == -1) { //fn在l的左边
			r = mid - 1;
		} else { //fn在r的右边
			l = mid + 1;
		}
		mid = (l + r) / 2;
	}
	return t;
}

int main() {
	int t;
	cin >> t;
	qaq();
	while (t--) {
		long long n;
		scanf("%lld", &n);
		long long ans = 0;
		int temp = find(n);
	 	ans =  (ans % mod + sum[temp - 1] % mod) % mod;
		ans =  (ans +  (temp * (n - s[temp].l + 1) ) % mod) % mod;
		printf("%lld\n", ans % mod);
	}
}

F_筷子

题意

类似于牛客多校写的那道手套题,贪心找出最亏的情况,注意结果只跟种类数与奇偶性相关。

思路

先考虑摸一双筷子的情况,答案必然为(种类数+1)。剩下的直接看代码注释。

代码

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define int long long
const int N = 1e6 + 5;
int a[N];

signed main() {
	int T;
	scanf("%lld", &T);
	while (T--) {
		LL n, m;
		scanf("%lld%lld", &n, &m);
		LL sum1 = 0, num = 0;
		for (int i = 1; i <= n; i++) {
			scanf("%lld", &a[i]);
			sum1 += a[i] / 2ll;
			if (a[i] % 2 == 1) {
				num += a[i] / 2;
			} else {
				num += a[i] / 2 - 1;
			}
		}
		if (sum1 < m) {
			printf("-1\n");
			continue;
		}
		LL ans = n + 1;
		m--;//组成一双筷子的情况: 1 1 1 1 …… 1 2
		//之后每加一双筷子就是能加2就加2,否则加1 (1 …… 1 2 3)(1 2 2)
		//在已经组成一双筷子的情况下,如果a[i]是偶数,则它可以提供的加2次数是a[i]/2-1 ,奇数则是a[i]/2
		if (num >= m) {
			ans += 2 * m;
		} else {
			ans += 2 * num + (m - num);
		}
		printf("%lld\n", ans);
	}
	return 0;
}

K_某时某地

题意

给定一个正整数 n,请分别求出对于 k=0,1,⋯,9,有多少个三元组 (x,y,z) 满足 1≤x,y,znx{YZ}k(mod10)。

思路

x^5与x 的个位数相同。

代码

待补

标签:return,河北省,long,int,补题,ans,lld,HBCPC2022,mod
From: https://www.cnblogs.com/oddpointa/p/16840640.html

相关文章

  • CF/AT 乱做/补题
    2021CFRound830CFRound829CFEducational138杂题选做......
  • CF昨天两场比赛补题目829+830(DIv2)
    CodeforcesRound#829(Div.2):A:https://codeforces.com/contest/1754/problem/A题意:给定一串由QA两个元素组成的字符串,判断是否Q的数量大于A的数量,如果是输出No,如果......
  • 补题记录(2022.10)
    补题记录2022ShanghaiCollegiateProgrammingContest(2022上海省赛)B-带权并查集+差分约束C-数学、贪心E-dp或ch表转移L-字符串哈希(已过,2000ms)orAC自动机......
  • Atcoder补题计划
    ◉ABC274F-Fishing//枚举作为左端点的鱼//每条鱼有一个在这个区间中的时间段//计算出与长度为a的区间有交集的时间的区间的权值的最大值//时间的区间(离散化......
  • 补题记录——Oct. Training 1-图论、集合哈希
    H-BoboniuWalksonGraphhttps://codeforces.com/problemset/problem/1394/B题意给n个点m条有向边,么个点的出度不超过k(k<=9),每条边都有一个边权在(\(1<=w<=m\))且每条边......
  • Codeforces Round #825 (Div. 2)(补题中)
    战绩:A.MakeAEqualtoB 实际上就只有两种操作可能,一种是遇到了不同的位置直接换,一种是换出0和1一样的个数后重新排列顺序,两种操作比较最小值输出。intmain(){......
  • 补题。。。
    补题(手写哈希表)[https://www.cnblogs.com/ALaterStart/p/16705514.html)位运算分治/位运算/二分已用递归实现,栈怎么写数学greedydfs去重补题......
  • codeforces/AtCoder补题整理
    目录cf1738CEvenNumberAddicts(博弈/记忆化搜索)题意题解cf1739EResetKEdges(树,二分+贪心)题意题解cf1730DPrefixesandSuffixes(字符串,思维)题意题解cf1734DS......
  • 【补题计划】CSP-S 2020
    【CSP-S2020】补题记录T1[CSP-S2020]儒略日模拟,可以找找周期规律,然后模拟,这样可能会大大减小代码量点击查看代码#include<bits/stdc++.h>#defineintlonglong......
  • 【补题计划】CSP-S 2021
    【CSP-S2021】补题记录T1[CSP-S2021]廊桥分配这明显就不是普通的签到题啊(记得当时我刚学OI只会数组和for循环搞出来15pts)......