1. 程式人生 > 實用技巧 >Zero Remainder Array (數學,思維 , STL)

Zero Remainder Array (數學,思維 , STL)

Zero Remainder Array

原題連結:傳送門

題目大意

給你一個數組有n個正數,你想讓這個陣列都變成可以整除 k 的元素,你可以執行兩種操作:

1.將ai + x ,然後 x ++

2.僅x++

一開始x = 0 ,求一共最少需要多少次操作可以使得滿足上述條件,且輸出最終的 x

分析

我們只需要記錄下來每個數t距離k的模數就可以了:

即 k - (t % k) , 如果這個模數已經出現過那麼我們需要再加上一個 k 來到下一個滿足要求的最小位置即可。 由於資料範圍很大我們可以利用map來進行儲存取模後的距離。

AC 程式碼

AC code

void slove()
{
	int n , k;cin >> n >> k;
	map<ll,ll> m; 
	ll x = 0 , t = 0 , flag = 0;
	for(int i = 0;i < n ;i ++)
	{	
		cin >> t ;
		if(t % k == 0)continue;
		flag = 1;
		int y = k - (t % k);
		int val = m[y];
		x = max(x ,(ll)val * k + y);
		m[y]++;
	}
	if(flag)cout << x + 1 << endl;
	else cout << 0 << endl;
}