| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 342329 | VodkaInTheJar | Sažetak (COCI17_sazetak) | C++14 | 1092 ms | 492 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#define endl '\n'
using namespace std;
const int maxn = 5e6 + 3; 
const int maxm = 13;
int n, m; 
int k[maxm];
void read()
{
	cin >> n >> m;
	for (int i = 1; i <= m; i++)
	cin >> k[i];
}
pair <long long, long long> extended_euclid(int a, int b)
{
	if (b == 0)
	return {1, 0};
	
	int r = a % b, q = a / b; 
	auto res = extended_euclid(b, r);
	
	return {res.second, res.first - 1ll * res.second * q};
}
bool dp[maxn];
long long val[13];
void solve()
{
	int ans = 0;
	for (int i = 1; i <= m; i++)
	if ((n - 1) % k[i] == 0)
	{
		ans++;
		break;
	}
	
	n++;
	set <long long> s;
	vector <pair <long long, long long> > v;
	for (int i = 1; i <= m; i++)
	for (int j = 1; j <= m; j++)
	if (__gcd(k[i], k[j]) == 1)
	{
		long long period = 1ll * k[i] * k[j];
		auto sol = extended_euclid(k[j], k[i]);
		
		long long num = sol.second * k[i];
		num %= period;
		if (num < 0)
		num += period;
		
		if (num > n-2)
		continue;
		
		v.push_back({period, num});
	}
	
	if (v.empty())
	{
		cout << ans << endl;
		return;
	}
	
	sort (v.begin(), v.end());
	ans += 1 + (n-2-v[0].second) / v[0].first;
	for (int i = 1; i < (int)v.size(); i++)
	{
		long long curr = v[i].second;
		for (int j = 0; j < i; j++)
		val[j] = curr % v[j].first;
		
		bool is = false;
		for (int j = 0; j < i; j++)
		if (__gcd(v[i].first, v[j].first) > 1)
		{
			is = true;
			break;
		}
		
		if (!is)
		{
			ans += 1 + (n-2-v[i].second) / v[i].first;
			continue; 
		}
		
		while (curr <= n-2)
		{
			bool can = false;
			for (int j = 0; j < i; j++)
			if (curr % v[j].first == v[j].second)
			{
				can = true;
				break;
			}
			
			if (!can)
			ans++;
			
			curr += v[i].first;
		}
	}
	
	cout << ans << endl; 
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	read();
	solve();
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
