#P2102. 数对.填空题

数对.填空题

题目描述

小辉得到了一个包含 n 个数的数列,他要从中选出两个不同位置的数形成个一个数对,要求较左边的数对 k 取余的结果小于等于较右边的数对 k 取余的结果。

问小辉有多少种选法。

输入格式

第一行,两个正整数 n 和 k

接着 n 个正整数,为数列的值。

数据范围

50% 的数据,2 <= n <= 10000 , 1 <= k <= 10 数列中每个数的值不超过 1000

100% 的数据,2 <= n <= 1000000, 1 <= k <= 50 ,数列中每个数的值不超过 1000

输出格式

一个正整数,表示答案。

样例

4 6
3 4 5 6
3

样例解释

3 , 4 , 5 , 6 对 6 取模的结果分别为 3 , 4 , 5 , 0 能构成的数对有 (3,4)、(3,5)、(4,5),共 3 个

解题思路

按照套路转换问题: 第 i 个数字和前面的某个数组配对(按照题目条件),看最终能配对成功多少对数字。

如果第 i 个数模 k 得到 10,那么就可以和 i 前面模 k 等于 0~10 的数字配对。进一步推广,如果第 i 个数模 k 为 j ,那么就可以和前面 1 到 i-1 位置模 k 为 0~j 的数字配对。

完善程序

#include<bits/stdc++.h>
using namespace std;
int sum[50];
long long ans;
int main()
{
	int n,k,t;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&t);
		t = 填空(1);

		for(int j=0;填空(2);j++)
			ans += 填空(3);
		
		sum[t] = 填空(4);
	}

	printf("%lld",ans);
	return 0;
}

填空(1):{{ input(1) }}

填空(2):{{ input(2) }}

填空(3):{{ input(3) }}

填空(4):{{ input(4) }}

填空(5):按照上面的算法,本题最坏的情况下计算复杂度为: O( {{ input(5) }} )