답안 #474615

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
474615 2021-09-19T07:59:25 Z egod1537 팔찌 (kriii4_V) C++14
6 / 100
1000 ms 16840 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 p) {
	ll ret = 1, piv = x % mod;
	while (p) {
		if (p & 1) ret *= piv;
		piv *= piv;
		ret %= mod;
		piv %= mod;
		p >>= 1;
	}
	return ret;
}
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:34:59: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |  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:48: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]
   48 |  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:56: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]
   56 |  if (num == arr.size()) return eulerp(dq, psum)*pwk[now];
      |      ~~~~^~~~~~~~~~~~~
V.cpp: In function 'll func(ll, ll)':
V.cpp:69: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]
   69 |  for (int i = 0; i < fact.size(); i++) {
      |                  ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 16840 KB Output is correct
2 Correct 23 ms 16812 KB Output is correct
3 Correct 24 ms 16840 KB Output is correct
4 Correct 26 ms 16840 KB Output is correct
5 Correct 23 ms 16784 KB Output is correct
6 Correct 23 ms 16820 KB Output is correct
7 Correct 23 ms 16808 KB Output is correct
8 Correct 23 ms 16776 KB Output is correct
9 Correct 23 ms 16840 KB Output is correct
10 Correct 23 ms 16780 KB Output is correct
11 Correct 23 ms 16840 KB Output is correct
12 Correct 25 ms 16724 KB Output is correct
13 Correct 23 ms 16724 KB Output is correct
14 Correct 23 ms 16728 KB Output is correct
15 Correct 25 ms 16840 KB Output is correct
16 Correct 24 ms 16816 KB Output is correct
17 Correct 24 ms 16752 KB Output is correct
18 Correct 23 ms 16828 KB Output is correct
19 Correct 23 ms 16708 KB Output is correct
20 Correct 26 ms 16828 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 16796 KB Output is correct
2 Correct 24 ms 16724 KB Output is correct
3 Correct 24 ms 16820 KB Output is correct
4 Correct 75 ms 16752 KB Output is correct
5 Correct 786 ms 16788 KB Output is correct
6 Correct 955 ms 16840 KB Output is correct
7 Correct 723 ms 16840 KB Output is correct
8 Correct 910 ms 16812 KB Output is correct
9 Execution timed out 1062 ms 16704 KB Time limit exceeded
10 Halted 0 ms 0 KB -