Educational Codeforces Round 106 (Rated for Div. 2)

A:Domino on Windowsill

  简单模拟。两侧都竖着放,中间交错的地方横着放,这样贪心的方法肯定是最优的,然后判断即可。

B:Binary Removals

  思维题。最后的串是一个单调非下降的子序列,我们不妨去枚举这样的01的分界点,这样前面半个串必须为0,后面半个串必须为1,然后再进行修改,这样很容易判断出修改是否有问题。

C:Minimum Grid Path

  贪心题。我们可以发现当 i i i是奇数的时候,我们可以得到 ( i + 1 ) / 2 , i / 2 (i+1)/2,i/2 (i+1)/2,i/2个两种方向不同的线段,当 i i i时偶数的时候,我们可以分别得到 i / 2 i/2 i/2个两种不同方向的线段。然后我们分别去统计出现在奇数位置和出现在偶数位置的最大值,给他们安排的长度是最长的,剩下的都是1即可。

D:The Number of Pairs

  题目大意是给定 c , d , x c,d,x c,d,x,问能够找到多少对 a , b a,b a,b,使得 c ∗ l c m ( a , b ) − d ∗ g c d ( a , b ) = x c*lcm(a,b)-d*gcd(a,b)=x clcm(a,b)dgcd(a,b)=x成立。
  首先,我们可以改成 a = A g , b = B g ( g c d ( A , B ) = 1 ) a=Ag,b=Bg(gcd(A,B)=1) a=Ag,b=Bg(gcd(A,B)=1),这样问题就转换成了 g ∗ ( c A B − d ) = x g*(cAB-d)=x g(cABd)=x成立的结果数。很明显 g g g必然是 x x x的一个因数,这可以在 O ( x ) O(\sqrt x) O(x )的时间内进行枚举,然后我们就可以得到 k 1 = x g + d k_1=\frac {x}{g}+d k1=gx+d,则 c c c也必须是 k 1 k_1 k1的一个因子,直接判断即可。这时候我们的 A B = k 2 = x + d g g c AB=k_2=\frac {x+dg}{gc} AB=k2=gcx+dg A , B A,B A,B互质的条件可以通过对 k 2 k_2 k2进行质因数分解,他们各自占一部分的质因子,交集为空,并集恰好是 k 2 k_2 k2全部的质因子。假设 k 2 k_2 k2的质因数有 n n n个,那么答案应该是 2 n 2^n 2n个。同时我们可以通过预处理的方式,一次性得到从1~MAXN的所有正整数的质因数个数。

#include<bits/stdc++.h>
#define close ios::sync_with_stdio(false)
using namespace std;
const int maxn=2e7+100;
int val[maxn];
void Init()
{
    for(int i=2;i<maxn;++i)
        if(!val[i])
            for(int j=i;j<maxn;j+=i) val[j]++;
}
int main()
{
    close;int T;cin>>T;
    Init();
    while(T--)
    {
        int c,d,x,ans=0;cin>>c>>d>>x;
        for(int i=1;i*i<=x;++i)
        {
            if(x%i!=0) continue;
            int k1=x/i+d;
            if(k1%c==0) ans+=1<<val[k1/c];
            if(i*i==x) continue;
            int k2=i+d;
            if(k2%c==0) ans+=1<<val[k2/c];
        }
        cout<<ans<<endl;
    }
}

E:Chaotic Merge

F:Diameter Cuts

  题目大意是给定一棵无根树,你可以选择删除一些边,使得删边后得到的所有子树的直径都 ≤ k \le k k,问有多少种删边方案。
  考虑到树的直径的树形DP的求解方案。我们都假设一开始以 r o o t root root为根结点的子树的最左侧有一棵空树,然后我们不断更新以 r o o t root root为端点的最长的树链。在合并的时候,假设 u u u r o o t root root的一个子结点,分为两种情况:①如果以 u u u为端点的最长链和以 r o o t root root为端点的最长链加起来并加上1后的长度没有 k k k长,那么我们可以去计数他俩相连的方案;②看看各自的子树中的最长链是否都没有 k k k长,就独立地对答案有一部分的贡献。需要注意的是,我们需要原始的数据进行计数,因此更新的时候需要先开一个临时存储空间

#include<bits/stdc++.h>
#define close ios::sync_with_stdio(false)
using namespace std;
const int maxn=5e3+100;
const int mod=998244353;
typedef long long ll;
ll dp[maxn][maxn],tmp[maxn],n,k;
vector<int> v[maxn];
int DFS(int root,int fa)
{
	int maxheight=0;dp[root][0]=1;
	for(int u:v[root]){
		if(u==fa) continue;
		int child=DFS(u,root);
		memset(tmp,0ll,sizeof(tmp));
		for(int i=0;i<=maxheight;++i)
			for(int j=0;j<=child;++j)
			{
				if(i+j+1<=k) tmp[max(i,j+1)]=(tmp[max(i,j+1)]+dp[root][i]*dp[u][j]%mod)%mod;
				if(i<=k && j<=k) tmp[i]=(tmp[i]+dp[root][i]*dp[u][j]%mod)%mod;
			}
		maxheight=max(maxheight,child+1);
		for(int i=0;i<=maxheight;++i) dp[root][i]=tmp[i];
	}
	return maxheight;
}
int main()
{
	close;cin>>n>>k;
	for(int i=1;i<n;++i)
	{
		int x,y;cin>>x>>y;
		v[x].push_back(y);v[y].push_back(x);
	}
	DFS(1,-1);
	ll ans=0;
	for(int i=0;i<=k;++i) ans=(ans+dp[1][i])%mod;
	cout<<ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值