建勋这几天在学习关于数组的知识,他遇到了一个难题,用他学过的数组知识好像解决不了。建勋只好去求助聪明的建国,题目是这样的:有两个数组,第一个包含了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;
}