1. 程式人生 > >鄭州輕工業OJ:2502: 建國與兩個陣列

鄭州輕工業OJ: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 <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;

}