Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define io ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
- #define ll long long
- #define ld long double
- #define EPS (1e-9)
- #define mod 1000000007
- #define pii pair<int, int>
- #define piii pair<pii, ll>
- #define SIZE(x) (int)x.size()
- #define to_string(x) static_cast< std::ostringstream & >( \
- ( std::ostringstream() << std::dec << x ) ).str()
- using namespace std;
- const ll OO = (1ll << 50);
- const int N = 200005;
- bool isPrime[N];
- ll n, m;
- vector<ll> primes;
- vector<piii> vec;
- void sieveAtkin() {
- int root = ceil(sqrt(N));
- for (int i = 1; i <= root; ++i) {
- for (int j = 1; j <= root; ++j) {
- int n = (4 * i * i) + (j * j);
- if (n <= N && (n % 12 == 1 || n % 12 == 5))
- isPrime[n] ^= true;
- n = (3 * i * i) + (j * j);
- if (n <= N && n % 12 == 7)
- isPrime[n] ^= true;
- n = (3 * i * i) - (j * j);
- if (i > j && n <= N && n % 12 == 11)
- isPrime[n] ^= true;
- }
- }
- for (int i = 5; i <= root; ++i)
- if (isPrime[i])
- for (int j = i * i; j < N; j += i * i)
- isPrime[j] = false;
- primes.push_back(2ll);
- primes.push_back(3ll);
- for (int i = 5; i < N; ++i) {
- if (isPrime[i])
- primes.push_back(1ll * i);
- }
- }
- int main() {
- // freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- cin >> n >> m;
- ll val = 1000000000;
- sieveAtkin();
- ll shortestPath = 0;
- for (int i = 1; i < n - 1; ++i) {
- piii cur;
- cur.first.first = i, cur.first.second = i + 1, cur.second = 1;
- vec.push_back(cur);
- --m, ++shortestPath;
- }
- ll last = upper_bound(primes.begin(), primes.end(), shortestPath) - primes.begin();
- //cout << last << " " << primes[last] << " " << shortestPath << endl;
- piii tmp;
- tmp.first.first = n - 1, tmp.first.second = n, tmp.second = primes[last] - shortestPath;
- shortestPath = primes[last];
- --m;
- vec.push_back(tmp);
- for (int i = 1; i <= n && m; ++i) {
- for (int j = i + 2; j <= n && m; ++j) {
- tmp.first.first = i, tmp.first.second = j, tmp.second = val;
- vec.push_back(tmp);
- --m;
- }
- }
- cout << shortestPath << " " << shortestPath << endl;
- for (auto vvvvv : vec) {
- cout << vvvvv.first.first << " " << vvvvv.first.second << " " << vvvvv.second << endl;
- }
- return 0;
- }
- //for (int i = 0; i < n; ++i)
- //for (int j = 0; j < n; ++j)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement