Divide by Zero 2021 and Codeforces Round #714 (Div. 2) ABC题解

Posted 桂月二四

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Divide by Zero 2021 and Codeforces Round #714 (Div. 2) ABC题解相关的知识,希望对你有一定的参考价值。

A. Array and Peaks
题目大意:寻找一个n的排列,使得这个排列有k个峰值。

思路:从i=2每隔两个数放置一个当前没有放的最大值,在放k个之后就停止(如果不足k个就输出-1)。接着继续从i=1开始,没有放置数字的位置接着放置当前没有放的最大值。

#include <iostream>
#include <unordered_map>
#include <cstring>
using namespace std;
typedef long long ll;
unordered_map<int,ll> mp;
const int N = 110;
int a[N],vis[N];
int main()

    int t;cin>>t;
    while(t--)
    
    	memset(a,0,sizeof a);
    	int n,k;cin>>n>>k;
		int cnt = n;
		int now = 0;
		for(int i=2;i<n&&k;i+=2)
			a[i] = cnt--,k--;
		if(k)
			puts("-1");
			continue;
		
		for(int i=1;i<=n;i++)
			if(!a[i]) a[i] = cnt--;
		for(int i=1;i<=n;i++)
			cout<<a[i]<<" ";
		puts("");
	
    return 0;

B. AND Sequences
给定一个数组a,询问a有多少种排列方式,使得每一个i,都有a1&a2&…&ai=ai+1&ai+2&…&an

思路:通过&的性质,发现这是一道排列组合题。
当时在做这道题时,注意到几个数字在一起&,结果只会越来越小。 于是就思考到找来a数组中的最小值,并且一头一尾放一个,中间的n-2个数字随便排 ; 记cnt为最小数字的个数,答案即为(cnt-1)*cnt*(n-2)!
然而很不幸的wa了,但是找最小值这个思路应该不会错吧。再次思考后发现,我们要寻找的“最小值”应该是a中所有数字&后的结果,这个结果如果在a中存在,那么就是最小值,如果不存在,就无解了。
代码:

#include <iostream>
#include <unordered_map>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
const ll N = 200010,mod = 1e9+7;
int a[N];
ll p[N];
int main()

	p[0] = p[1] = 1;
	for(int i=2;i<=200000;i++)
		p[i] = (p[i-1]*i)%mod;//预处理阶乘 
    int t;cin>>t;
    while(t--)
    
		ll n;cin>>n;
		scanf("%d",&a[1]);
		int minn = a[1];
		for(int i=2;i<=n;i++)
		
			scanf("%d",&a[i]);
			minn&=a[i];
		
		ll cnt = 0;
		for(int i=1;i<=n;i++)
			if(a[i]==minn) cnt++;
		if(cnt<2)
		
			puts("0");
			continue;
		
		ll res = cnt*(cnt-1)%mod*p[n-2]%mod;
		printf("%lld\\n",res);
	
    return 0;

Add One
题目大意:给定一个数字n,进行m次操作,每次可以给n的每一位数字加1,求最后n的位数。

思路:这是一道dp问题。我们可以单独的考虑n的每一位数字在进行m次操作后的位数,最后累加即可。
又注意到,不同的数字(0~9)在进行m次累加后的结果是有关联的,因此我们直接定义dp数组f[i]为数字10进行了i次操作后的位数。 f[i] = f[i-9]+f[i-10] 初始化:f[0~8] = 2,f[9] = 3;
有了这个dp数组之后,我们就可以通过10 来计算出0~9的结果了
代码:

#include <iostream>
#include <unordered_map>
using namespace std;
typedef long long ll;
unordered_map<int,ll> mp;
const int N =200010,mod = 1e9+7;
int f[N];
void init()

	for(int i=0;i<=8;i++) f[i] = 2;
    f[9] = 3;
    for(int i=10;i<=200000;i++) f[i] = (f[i-9]+f[i-10])%mod;

int main()

	init();//初始化 
    int t;scanf("%d",&t);
    int n,m;
    while(t--)
    	
		int res = 0;
    	int a[20],cnt = 0;
    	scanf("%d%d",&n,&m);
    	while(n) a[++cnt] = n%10,n/=10;
    	for(int i=1;i<=cnt;i++)
    		if(a[i]+m<10) res = (res+1)%mod;
    		else res = (res+f[m-(10-a[i])])%mod;
    	printf("%d\\n",res);
	
    return 0;

为什么没有D?因为菜

以上是关于Divide by Zero 2021 and Codeforces Round #714 (Div. 2) ABC题解的主要内容,如果未能解决你的问题,请参考以下文章

Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined)G - Bandit Blues

听力Why Can’t You Divide by Zero?

Divide by Zero 2017 D&E&F

CWE-369:Divide By Zero除数有可能为零缺陷是如何产生的?

codeforces 792C. Divide by Three

CodeForce-792C Divide by Three(数学)