답안 #102177

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
102177 2019-03-23T05:08:57 Z IvanC Mobitel (COCI19_mobitel) C++17
65 / 130
6000 ms 66560 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int> ii;

const int MAXN = 302;
const int MOD = 1e9 + 7;

list<ii> paths[2][MAXN];
int matriz[MAXN][MAXN],dp[MAXN][MAXN],R,S,N, current_x;
ll tot;



ll fast_expo(ll x, ll y){
	if(y == 0) return 1;
	if(y % 2 == 0){
		ll temp = fast_expo(x, y/2);
		return (temp*temp) % MOD;
	}
	else{
		return (x*fast_expo(x, y - 1)) % MOD;
	}
}

ll mod_inv(ll x){
	return fast_expo(x, MOD - 2);
}

ll fatorial(int n){

	ll ans = 1;
	for(int i = 2;i<=n;i++){
		ans = (ans * i) % MOD;
	}

	return ans;

}

ll binomial(int n, int k){

	ll ans = (fatorial(n) * mod_inv(fatorial(k)) ) % MOD;
	ans = (ans *  mod_inv(fatorial(n - k))) % MOD;

	return ans;

}

void in_place_merge(int x, int y, int factor, int second_factor){

	int max_value = N/second_factor;
	int ptr[2], a[2], b[2], sz[2];
	list<ii>::iterator it[2];
	ptr[0] = ptr[1] = 0;
	a[0] = x, a[1] = x ^ 1;
	b[0] = y - 1, b[1] = y; 
	sz[0] = paths[a[0]][b[0]].size(), sz[1] = paths[a[1]][b[1]].size();
	it[0] = paths[a[0]][b[0]].begin(), it[1] = paths[a[1]][b[1]].begin();

	while(ptr[0] < sz[0] || ptr[1] < sz[1]){

		ii element = ii(-1, -1);

		if(ptr[0] == sz[0]){
			if((*it[1]).first > max_value){
				ptr[1] = sz[1];
				continue;
			}
			element = *it[1];
			it[1]++;
			ptr[1]++;
		}
		else if(ptr[1] == sz[1]){
			if((*it[0]).first > max_value){
				ptr[0] = sz[0];
				continue;
			}
			element = *it[0];
			it[0]++;
			ptr[0]++;
		}
		else if((*it[0]) <= (*it[1])){
			if((*it[0]).first > max_value){
				ptr[0] = sz[0];
				continue;
			}
			element = *it[0];
			it[0]++;
			ptr[0]++;
		}
		else{
			if((*it[1]).first > max_value){
				ptr[1] = sz[1];
				continue;
			}
			element = *it[1];
			it[1]++;
			ptr[1]++;
		}

		if(paths[x][y].empty() || paths[x][y].back().first != element.first){
			paths[x][y].push_back(element);
		}
		else{
			paths[x][y].back().second = (paths[x][y].back().second + element.second) % MOD;
		}

	}

	for(list<ii>::iterator nit = paths[x][y].begin();nit != paths[x][y].end();nit++){
		(*nit).first *= factor;
	}

}

int solve(int x,int y){

	if(dp[x][y] != 0) return dp[x][y];

	if(x == R && y == S) return matriz[x][y];

	ll cand;

	if(x + 1 <= R && y + 1 <= S){
		cand = 1LL*matriz[x][y]*min(solve(x+1,y), solve(x, y + 1));
	}
	else if(x + 1 <= R){
		cand = 1LL*matriz[x][y]*solve(x+1,y);
	}
	else{
		cand = 1LL*matriz[x][y]*solve(x,y+1);
	}

	if(cand <= N){
		return dp[x][y] = cand;
	}
	else{
		return dp[x][y] = N+1;
	}

}

int main(){

	scanf("%d %d %d", &R, &S, &N);
	N--;

	for(int i = 1;i<=R;i++){
		for(int j = 1;j<=S;j++){
			scanf("%d",&matriz[i][j]);
		}
	}

	if(matriz[1][1] <= N) paths[current_x][1].push_back(ii(matriz[1][1], 1));
	for(int i = 2;i<=S;i++){
		in_place_merge(current_x, i, matriz[1][i], solve(1, i));
	}

	for(int i = 2;i <= R;i++){

		current_x ^= 1;
		for(int j = 1;j<=S;j++) list<ii>().swap(paths[current_x][j]);

		for(int j = 1;j<=S;j++){
			in_place_merge(current_x, j, matriz[i][j], solve(i, j));
		}

	}

	ll ans = binomial(R + S - 2, S - 1);
	for(ii davez : paths[current_x][S]){
		ans = ans - davez.second;
		ans %= MOD;
	}

	if(ans < 0) ans += MOD;
	printf("%lld\n",ans);

	return 0;

}

Compilation message

mobitel.cpp: In function 'int main()':
mobitel.cpp:147:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d", &R, &S, &N);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
mobitel.cpp:152:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d",&matriz[i][j]);
    ~~~~~^~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 723 ms 4984 KB Output is correct
2 Correct 24 ms 1016 KB Output is correct
3 Correct 536 ms 7488 KB Output is correct
4 Correct 447 ms 6460 KB Output is correct
5 Runtime error 1413 ms 66560 KB Execution killed with signal 9 (could be triggered by violating memory limits)
6 Runtime error 431 ms 66560 KB Execution killed with signal 9 (could be triggered by violating memory limits)
7 Correct 102 ms 3324 KB Output is correct
8 Runtime error 182 ms 66560 KB Execution killed with signal 9 (could be triggered by violating memory limits)
9 Runtime error 194 ms 66560 KB Execution killed with signal 9 (could be triggered by violating memory limits)
10 Execution timed out 6089 ms 56952 KB Time limit exceeded