求助站外题60分超时
  • 板块学术版
  • 楼主Zjc20120331
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/3/19 10:54
  • 上次更新2023/10/23 21:09:17
查看原帖
求助站外题60分超时
654928
Zjc20120331楼主2023/3/19 10:54

题目描述

给定一个正整数 kk,和 nn 个正整数a1,a2,,ana_1,a_2,\cdots, a_n,现在想要从 a1,a2,,ana_1,a_2,\cdots, a_n 中选出若干个数(也可以一个都不取),使得选出的数之和除以 kk 的余数恰好等于 rr。问有多少种取数的方案?

例如:k=3k=3,要从 1,3,81,3,8 中选若干数。和除以 k=3k=3 的余数为0的有 0,3,1+8,1+3+80,3,1+8,1+3+844 种;除 3311 的有 1,1+31,1+3 这2种;除 3322 的有 8,3+88,3+822 种。

注意:我们认为一个数都不取也是一种取数方案,此时认为和为 00

对每个余数 r=0,1,,k1r=0,1,\cdots,k-1,输出和除以 kkrr 的取数方法数。

输入格式

第1行,2个正整数 n,kn,k

第2行,nn 个正整数 a1,a2,,ana_1,a_2,\cdots, a_n

输出格式

输出 kk 行,第 ii 行输出和除以 kk 余数为 i1i-1 的取数方法数。

60分代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int n, k, r, a[25], cnt;

void dfs(int step, long long sum){
	if (step > n){
		
		if (sum%k == r){
			cnt++;
		}
		return ;
	}
	dfs(step+1, sum);
	dfs(step+1, sum+a[step]);
}

int main(){
	cin >> n >> k;
	for (int i = 1; i <= n; i++){
		cin >> a[i];
	}
	for (; r < k; r++){
		cnt = 0;
		dfs(1, 0);
		printf("%d\n", cnt);
	}
	return 0;
}
2023/3/19 10:54
加载中...