2502: 建国与两个数组

建勋这几天在学习关于数组的知识,他遇到了一个难题,用他学过的数组知识好像解决不了。建勋只好去求助聪明的建国,题目是这样的:有两个数组,第一个包含了1到n共n个数字,第二个包含了1到m共m个数字。建勋想要从两个数组中各挑选出一个整数x,y,使得x,y的和为k的倍数。

建国想利用这个机会考考你们,请问有多少种组合的方式?

第一行输入一个整数T,表示样例数量。(1 <= T <= 1000)
接下来T行,每行输入三个整数n,m,k。(1 <= n, m, k <= 1000)

对于每个样例,输出满足的对数。

样例输入 Copy
2
1 1 1
6 7 7

样例输出 Copy
1
6
提示
第一个样例只有(1,1)1种。
第二个样例有(1,6),(2,5),(3,4),(4,3),(5,2),(6,1)共6种。

#include<stdio.h>
int main()
{
	int a[1000],a1[10000];
	int sum=0,n,m,t,i,k;
	scanf("%d", &t);
	while(t--)
	{
sum=0;
int a[1000]={0};//由于第二次测试实例可能没有涉及到一些余数,但是上一次的实列的余数还存在a[]里,所以做完一次就要初始化一次;
		scanf("%d%d%d", &n,&m,&k);
		for(i=1;i<=n;i++)
		{
			a[i%k]++;//两面记录第一个数组的每个i对k的余数出现的次数;
		}
		for(i=1;i<=m;i++)
		{
			if(i%k!=0)
			sum+=a[k-i%k];//每个关于k的余数与上一个数组中的余数可以相加等于k则这两个数相加可以是k的倍数。计算组合数即可。
			else
			sum+=a[0];
		}
		printf("%d\n", sum);
	}
	return 0;
}

还有第二种暴力法,但是神奇的是某oj就是超限不让你如此简单的过去~很无奈。

#include<stdio.h>
int main()
{
	int t,sum=0,k,i,n,m,x;
	int a1[1000],a2[1000];
	scanf("%d", &t);
	while(t--)
	{
		
		scanf("%d%d%d", &n,&m,&k);
		for(i=0;i<n;i++)
		{
			a1[i]=i+1;
		}
		for(i=0;i<m;i++)
		{
			a2[i]=i+1;
		}
		int count=0;
		for(i=0;i<n;i++)
		{
			for(x=0;x<m;x++)
			{
				sum=a1[i]+a2[x];
				if(sum%k==0)
				count++;
			}
		}
		printf("%d\n", count);
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值