AtCoder Beginner Contest 221

A - Find Multiple

  • 题目大意

  • 思路

  • Code

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

int a,b,c;

int main()
{
	cin>>a>>b>>c;
	int fl=0;
	for(int i=a;i<=b;i++)
	{
		if(i%c==0)
		{
			printf("%d\n",i);
			fl=1;
			break;	
		} 
	}
	if(fl==0) cout<<-1<<endl;
	
	return 0;
}

B - Base K

  • 题目大意

  • 思路

  • Code

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

long long k;
string a,b;

int main()
{
	cin>>k>>a>>b;
	//cout<<k<<endl<<a<<endl<<b<<endl;
	long long c=0,d=0;
	for(int i=0;i<a.length();i++)
	{
	    c=c*k+a[i]-'0';
	}
	for(int j=0;j<b.length();j++)
	{
	    d=d*k+b[j]-'0';
	}
	cout<<c*d<<endl;

	return 0;
}

C - Long Sequence

  • 题目大意

  • 思路

  • Code

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
long long n,a[N];
long long x,s=0;

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		s+=a[i];
	}
	cin>>x;
	long long ans=(x/s)*n; 
	x%=s;
	int i=1;
	while(x>=0){
		x-=a[i++];
		ans++;
	} 
	cout<<ans<<endl;
	
	return 0;
}

D - FG operation

  • 题目大意
    给定一个长度为n的序列,序列中每一个数字都为0-9,,现在有两种操作:F:最左端的两个数x,y - > (x+y)%10;G:最左端的两个数x,y - > (x*y)%10;问:最后还剩一个数的时候,这个数为0-9的方案分别有多少种(MOD998244353)。
  • 思路
    DP:这个状态好想,但是初始化要注意。
  • Code
#include<bits/stdc++.h>
using namespace std;
const int N = 100010, MOD = 998244353;

int n,a[N],f[N][11];

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	f[1][a[1]]=1;
	for(int i=2;i<=n;i++)
		for(int j=0;j<=9;j++)
		{
			for(int k=0;k<=9;k++)
			{
				if((k+a[i])%10==j) f[i][j]=(f[i][j]+f[i-1][k])%MOD;
				if((k*a[i])%10==j) f[i][j]=(f[i][j]+f[i-1][k])%MOD;
			}
		}
	long long ans=0;
	for(int i=0;i<=9;i++) cout<<f[n][i]<<endl;

	return 0;
}

E - Distance on Large Perfect Binary Tree

  • 题目大意
    给定一颗n层的满二叉树,求它上面路径长度为d的路径条数。

  • 思路
    挺有意思的题:慢慢描述一下:
    每个节点到别的节点路径长度为d的路径由向左x和向右走d-x步组成;
    向左向右走路径长度为x:为向下走x层的节点数;
    这是假设在满二叉树为无限大的情况下,实际 ,树的深度有限,统计的时候只要向下取一个max(0,x)就好了。
    虽然思路和代码简单,但是是好题,要想好久的。

  • Code

#include<bits/stdc++.h>
using namespace std;
 
typedef long long ll;
const int mod = 998244353;
 
const int N = 2e6 + 10;
ll a[N];
int n, d;
 
int main()
{
    cin >> n >> d;
    ll p = 1;
    for(int i = 0; i <= n; i++)
	{
        a[i] = p;
        p = p * 2 % mod;
    }
    ll ans = a[d] * (a[max(n - d, 0)] - 1) % mod;
    for(int i = 1; i < d; i++)
	{
        if(i < n && d - i < n)
            ans = ans + a[i - 1] * a[d - i - 1] % mod * (a[n - max(i, d - i)] - 1) % mod;
    }
    cout << ans * 2 % mod << endl;
    return 0;
}

F - Distance Sums 2

  • 题目大意
    求一棵树上每个节点到其他节点的距离和。
  • 思路
    首先,求出每颗子树的size - > f[u];
    然后,求出父亲节点到所有节点的距离,当然节点1(根节点)在第一遍dfs时先可以求出 - > ans[u]。
    最后,第二次dfs:ans[u] = father到他这边子树的距离 - 一条他与father相连的边带来的权值 + father到另一边子树的距离 + 与father相连的这条边带来的权值 = ans[fa[u]] - f[u] + n - f[u]
  • Code
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
typedef long long ll;
ll f[N]; //f[u]表示以u为根的树的size
ll ans[N];  //ans[u]表示节点u到其他节点的距离和
vector<ll> v[N]; 
int cnt=0;
ll n;

void dfs(int u,int p,int k)
{
	for(auto i : v[u])
	{
		if(i!=p)
		{
			ans[1]+=k;
			dfs(i,u,k+1);
			f[u]+=f[i];
		}
	}
	f[u]++;
}
void dfs2(int u,int p)
{
	for(auto i : v[u])
	{
		if(i!=p)
		{
			ans[i]+=ans[u]-2*f[i]+n;
			dfs2(i,u);
		}
	}
}
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		v[x].push_back(y);v[y].push_back(x);
	}
	dfs(1,-1,1);
	dfs2(1,-1);
	for(int i=1;i<=n;i++)
	{
		printf("%lld\n",ans[i]);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值