鄭州輕工業OJ:2502: 建國與兩個陣列
阿新 • • 發佈:2019-01-05
題目描述
建勳這幾天在學習關於陣列的知識,他遇到了一個難題,用他學過的陣列知識好像解決不了。建勳只好去求助聰明的建國,題目是這樣的:有兩個陣列,第一個包含了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; }