题目描述
建勋这几天在学习关于数组的知识,他遇到了一个难题,用他学过的数组知识好像解决不了。建勋只好去求助聪明的建国,题目是这样的:有两个数组,第一个包含了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 <iostream>
#include <cstring>
using namespace std;
const int MAX=1005;
int booka[MAX];
int bookb[MAX];
int main()
{
int T;
cin>>T;
int n,m,k;
while(T--)
{
memset(booka,0,sizeof(booka)); // memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
memset(bookb,0,sizeof(bookb)); //头文件 memory.h或者string.h
int sum=0;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
booka[i%k]++; //桶排思想 取余
}
for(int i=1;i<=m;i++)
{
bookb[i%k]++; //桶排思想 取余
}
for(int i=1;i<k;i++) //这里不要从0开始,从0开始不会计算,0的情况应该与0的情况进行计算,此时都是k的倍数,在进行组合
{
sum=sum+booka[i]*bookb[k-i]; // 这里是 组合方式问题 a*b
}
sum=sum+booka[0]*bookb[0]; //加上已经是k的倍数的情况
cout<<sum<<endl;
}
return 0;
}