洛谷刷题(5)

P5534 【XR-3】等差数列

题目描述

小 X 给了你一个等差数列的前两项以及项数,请你求出这个等差数列各项之和。

等差数列:对于一个 n 项数列 a,如果满足对于任意 i∈[1,n),有 ai+1−ai=d,其中 d 为定值,则称这个数列为一个等差数列。

输入格式

一行 3 个整数 a1,a2,n,表示等差数列的第 1,2项以及项数。

数据范围:

  • ∣a1∣,∣a2∣≤106
  • 3≤n≤1000000。

输出格式

一行一个整数,表示答案。

代码

#include<stdio.h>
long long int a1, a2, n;
int main() {

	scanf("%ld%ld%ld", &a1, &a2, &n);
	int d = a2 - a1;
	int b = a1 + (n - 1) * d;

	printf("%ld", (2*a1 + (n - 1) * d) * n / 2);
	return 0;
}

P5594 【XR-4】模拟赛

题目描述

X 校正在进行 CSP 前的校内集训。

一共有 n 名 OIer 参与这次集训,教练为他们精心准备了 m 套模拟赛题。

然而,每名 OIer 都有各自的时间安排,巧合的是,他们在接下来的 k 天中都恰好有 m 天有空打模拟赛。

为了方便管理,教练规定一个人必须按顺序打完 m 套模拟赛题。

比如,小 X 在接下来的第 2,3,5 天有空打模拟赛,那么他就必须在第 2 天打第 1 套模拟赛题,第 3 天打第 2 套模拟赛题,第 5 天打第 3 套模拟赛题。

教练需要为每一个人的每一次模拟赛做准备,为了减小工作量,如果在某一天有多个人打同一套模拟赛题,那么教练只需要在这一天准备一场使用这一套题的模拟赛即可。

你作为机房大佬,教练想请你帮他计算一下,他每天需要准备多少场模拟赛。

输入格式

第一行三个整数 n,m,k。

接下来 n 行,每行 m 个整数,第 i 行第 j 列的整数 ai,j​ 表示第 i 个人在接下来的 k 天中第 j 个有空的日子为第 ai,j 天。

输出格式

一行 k 个整数,第 i 个整数表示接下来的第 i 天教练需要准备的模拟赛场数。

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n, m, k, ans[2004], vis[2004][2004], a[2004][2004];
int main() {

	memset(ans, 0, sizeof(ans));
	
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			scanf("%d", &a[i][j]);
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (!vis[j][a[i][j]]) {
				vis[j][a[i][j]] = 1;
				ans[a[i][j]]++;
			}
		}
	}
	for (int i = 1; i <= k; i++) {
		printf("%d ", ans[i]);
	}
	return 0;
}

P1025 [NOIP2001 提高组] 数的划分

题目描述

将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

例如:n=7,k=3,下面三种分法被认为是相同的。

1,1,5;
1,5,1;
5,1,1.

问有多少种不同的分法。

输入格式

n,k (6<n≤200,2≤k≤6)

输出格式

1 个整数,即不同的分法。

 代码

#include<stdio.h>
int n;//表示即将被划分的整数
int k;//被划分的数量
int cnt;//有多少种不同的分法
void dfs(int a, int b, int c) {
	if (c == k) {
		if (b == n) {
			cnt++;
		}
		return;
	}
	for (int i = a; b + i * (k - c) <= n; i++) {
		dfs(i, b + i, c + 1);
	}
}
int main() {
	scanf("%d%d", &n, &k);
	dfs(1, 0, 0);
	printf("%d", cnt);
	return 0;
}

P10415 [蓝桥杯 2023 国 A] 切割

题目描述

给定一个 W×H 的长方形,两边长度均为整数。小蓝想把它切割为很多个边长为整数的小正方形。假设切割没有任何损耗,正方形的边长至少为 2,不允许出现余料,要求所有正方形的大小相等,请问最多能切割出多少个?

输入格式

输入一行,包含两个整数 W,H,用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。如果不存在满足要求的方案,输出 0。

代码

#include<stdio.h>
long long W, H;
int d = 1;
int main() {
	scanf("%ld%ld", &W, &H);
	while (d++) {//从2开始
		if ((W % d) == 0 && (H % d) == 0) {
			printf("%ld", W * H / (d * d));
			return 0;
		}
		if (d > W && d > H) {
			printf("0");
			return 0;
		}
	}
	return 0;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值