ABC163A至D题题解

A题

A题问说知道半径,要求周长,那么直接把 C C C= 2 π r 2πr 2πr这个公式套上去,OK~
当然,求圆周率有一个函数:acos(-1),就不用慢慢背“ 3.1415926535897932384626433832795 ‬ 3.1415926535897932384626433832795‬ 3.1415926535897932384626433832795”了。
CODE:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int R;
	cin >> R;
	cout << R*2*acos(-1) << endl;
	return 0;
}

B题

B题就是纯模拟,只要把下面的数全加起来,再和N比个大小,最后输出-1或它们的差就行了
CODE:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int m, n, x, t=0;
	cin >> m >> n;
	for (int i=1; i<=n; i++)
	{
		cin >> x;
		t+=x;
	}
	if (t>m) cout << -1 << endl;
	else cout << m-t << endl;
	return 0;
}

C题

这看似是个树状结构,但我们并不需要了解一个节点的整个子树,所以,只要简单的数组累计,就可以啦~
CODE:

#include <bits/stdc++.h>
using namespace std;
int sum[200002];
int main()
{
	int n, x;
	cin >> n;
	for (int i=2; i<=n; i++)
	{
		cin >> x;
		sum[x]++;
	}
	for (int i=1; i<=n; i++) cout << sum[i] << endl;
	return 0;
}

D题

这道题其实就是数学。我们只要求当取 k k k个数时, m a x max max- m i n min min+ 1 1 1就能得到当前的总数量。 m a x max max就是取 k k k个数时的最大值, m i n min min就是指取 k k k个数时的最小值。
然后,让 k k k++,一直加到 n n n+ 1 1 1为止。
当然,学过数学的人都知道,这个累加过程可以用求和公式,而两个求和公式相减也可以用分配率。具体过程大家可以自行推导,我这里就说一下最终的推导结果:
当取 k 个数时,和的数量就是 ( n - k + 1 ) × k + 1 \text{当取}k\text{个数时,和的数量就是}(n\text{-}k\text{+}1)\text{×}k\text{+}1 当取k个数时,和的数量就是(n-k+1)×k+1
别忘了 m o d ( 1 0 9 + 7 ) mod(10^9\text{+}7) mod(109+7)哦~

#include <bits/stdc++.h>
using namespace std;
int main(){
	long long n, k, t=0;
	cin >> n >> k;
	for (long long i=k; i<=n+1; i++) t+=(n-i+1)*i+1, t%=1000000007;
	cout << t << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值