답안 #474613

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
474613 2021-09-19T07:57:37 Z egod1537 팔찌 (kriii4_V) C++14
6 / 100
1000 ms 16848 KB
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll mod = 1e9 + 7;

typedef pair<ll, ll> pi;
#define var first
#define cnt second

ll pwk[2000001];
bitset<1000001> vit;
vector<ll> prime;

ll pow(ll x, ll cnt) {
	if (cnt == 0) return 1;
	ll mid = pow(x, cnt >> 1)%mod;
	return (((mid * mid)%mod) * (cnt % 2 ? x : 1)) % mod;
}
ll revmod(ll x) { return pow(x, mod - 2) % mod; }	
vector<pi> getfactor(ll num) {
	vector<pi> ans;
	for (int i = 0; num > 1 && prime[i]*prime[i] <= num && i < prime.size(); i++) {
		ll now = prime[i];
		pi p = pi(now, 0);
		while (num % now == 0) {
			p.cnt++;
			num /= now;
		}
		if (p.cnt > 0) ans.push_back(p);
	}
	if (num > 1) ans.push_back(pi(num, 1));
	return ans;
}
ll eulerp(vector<pi>& factor, vector<vector<ll>>& psum) {
	ll ans = 1;
	for (int i = 0; i < factor.size(); i++) {
		pi& p = factor[i];
		if (p.cnt == 0) continue;
		ans = (ans * ((psum[i][p.cnt-1] * (p.var - 1)) % mod)) % mod;
	}
	return ans;
}
ll dfs(int num, ll k, ll now, vector<pi>& arr, vector<pi>& dq, vector<vector<ll>>& psum) {
	if (num == arr.size()) return eulerp(dq, psum)*pwk[now];
	ll ans = 0;
	for (int i = 0; i <= arr[num].cnt; i++) {
		dq[num].cnt = arr[num].cnt - i;
		ans = (ans + dfs(num+1, k, now*psum[num][i], arr, dq, psum))%mod;
	}
	return ans;
}
ll r2;
ll func(ll n, ll k) {
	ll ans = 0;
	vector<pi> fact = getfactor(n);
	vector<vector<ll>> psum(fact.size());
	for (int i = 0; i < fact.size(); i++) {
		psum[i].resize(fact[i].cnt+1);
		psum[i][0] = 1;
		for (int j = 1; j <= fact[i].cnt; j++) 
			psum[i][j] = psum[i][j - 1] * fact[i].var;
	}
	vector<pi> dq(fact.begin(), fact.end());
	ans = dfs(0, k, 1, fact, dq, psum);
	if (n % 2) ans = (ans + (n * pwk[n/2+1])%mod)%mod;
	else {
		ll pw = (pwk[n/2] + pwk[n/2+1]) % mod;
		ans = (ans + (((n * pw)%mod)*r2)%mod)%mod;
	}

	return (ans * revmod(2 * n)) % mod;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	for (int i = 2; i <= 1000000; i++) {
		if (!vit[i]) prime.push_back(i);
		else continue;
		for (int j = 2 * i; j <= 1000000; j += i) vit[j] = true;
	}

	ll n, k; cin >> n >> k;

	pwk[0] = 1;
	for (int i = 1; i <= 2000000; i++) pwk[i] = (pwk[i - 1] * k) % mod;
	r2 = revmod(2);

	ll ans = 1;
	for (int i = 1; i <= n; i++) ans = (ans + func(i, k)) % mod;
	cout << ans;

	return 0;
}

Compilation message

V.cpp: In function 'std::vector<std::pair<long long int, long long int> > getfactor(ll)':
V.cpp:28:59: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |  for (int i = 0; num > 1 && prime[i]*prime[i] <= num && i < prime.size(); i++) {
      |                                                         ~~^~~~~~~~~~~~~~
V.cpp: In function 'll eulerp(std::vector<std::pair<long long int, long long int> >&, std::vector<std::vector<long long int> >&)':
V.cpp:42:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |  for (int i = 0; i < factor.size(); i++) {
      |                  ~~^~~~~~~~~~~~~~~
V.cpp: In function 'll dfs(int, ll, ll, std::vector<std::pair<long long int, long long int> >&, std::vector<std::pair<long long int, long long int> >&, std::vector<std::vector<long long int> >&)':
V.cpp:50:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |  if (num == arr.size()) return eulerp(dq, psum)*pwk[now];
      |      ~~~~^~~~~~~~~~~~~
V.cpp: In function 'll func(ll, ll)':
V.cpp:63:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |  for (int i = 0; i < fact.size(); i++) {
      |                  ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 16840 KB Output is correct
2 Correct 23 ms 16712 KB Output is correct
3 Correct 23 ms 16828 KB Output is correct
4 Correct 23 ms 16812 KB Output is correct
5 Correct 23 ms 16816 KB Output is correct
6 Correct 24 ms 16804 KB Output is correct
7 Correct 28 ms 16828 KB Output is correct
8 Correct 27 ms 16784 KB Output is correct
9 Correct 23 ms 16832 KB Output is correct
10 Correct 23 ms 16760 KB Output is correct
11 Correct 28 ms 16732 KB Output is correct
12 Correct 23 ms 16848 KB Output is correct
13 Correct 23 ms 16776 KB Output is correct
14 Correct 23 ms 16840 KB Output is correct
15 Correct 23 ms 16840 KB Output is correct
16 Correct 23 ms 16832 KB Output is correct
17 Correct 25 ms 16780 KB Output is correct
18 Correct 24 ms 16828 KB Output is correct
19 Correct 23 ms 16776 KB Output is correct
20 Correct 27 ms 16768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 16840 KB Output is correct
2 Correct 25 ms 16768 KB Output is correct
3 Correct 26 ms 16732 KB Output is correct
4 Correct 80 ms 16816 KB Output is correct
5 Correct 843 ms 16724 KB Output is correct
6 Execution timed out 1056 ms 16840 KB Time limit exceeded
7 Halted 0 ms 0 KB -