#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define pb push_back
#define dd(x) cout<<#x<<" is "<<x<<endl;
#define dl(x) cout<<#x<<" is "; for(auto i:x) cout<<i<<' '; cout<<endl;
typedef pair<int,int> pii;
const int N = 305, M = 305;
int dp[M][90005], a[N], b[M];
signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int n,m,k; cin>>n>>m>>k;
	int tot = 0;
	for(int i=1; i<=n; i++) cin>>a[i], tot+=a[i];
	
	for(int i=1; i<=m; i++) cin>>b[i];
	
	if(m<k) {cout<<"Impossible"; return 0;}
	for(int i=1; i<=n; i++){
		if(a[i] < k) {cout<<"Impossible"; return 0;}
	}
	
	int ans = LLONG_MAX;
	for(int i=0; i<(1<<m); i++){
		int sum = 0, cnt=0;
		deque<int>d;
		for(int j=0; j<m; j++){
			if(i&(1<<j)) {
				sum += b[j+1];
				cnt++;
				d.pb(b[j+1]);
			}
		}
		//dl(d);
		//if(sum == 7) dd(2)
		if(cnt < k or sum < tot) continue;
		
		//if(sum == 7) dd(1)
		bool f = 0;
		for(int j=0; j<n; j++){
			if(d.size() < k) {f=1; break;}
			for(int x=0; x<k; x++){
				int y = d[0]; d.pop_front();
				y--;
				if(y != 0) d.push_back(y);
			}
		}
		if(f) continue;
		ans = min(ans,sum-tot);	
	}
	
	if(ans == LLONG_MAX) cout<<"Impossible";
	else cout<<ans;
	
	return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |