답안 #474592

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
474592 2021-09-19T07:35:39 Z egod1537 팔찌 (kriii4_V) C++14
6 / 100
1000 ms 16868 KB
#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) {
	//return 1;
	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) {
	//if (n % 10000 == 0) cout << n << "\n";
	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:24:59: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |  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:39: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]
   39 |  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:47: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]
   47 |  if (num == arr.size()) return eulerp(dq, psum)*pwk[now];
      |      ~~~~^~~~~~~~~~~~~
V.cpp: In function 'll func(ll, ll)':
V.cpp:61: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]
   61 |  for (int i = 0; i < fact.size(); i++) {
      |                  ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 16840 KB Output is correct
2 Correct 24 ms 16760 KB Output is correct
3 Correct 23 ms 16776 KB Output is correct
4 Correct 23 ms 16744 KB Output is correct
5 Correct 23 ms 16868 KB Output is correct
6 Correct 23 ms 16748 KB Output is correct
7 Correct 24 ms 16832 KB Output is correct
8 Correct 23 ms 16760 KB Output is correct
9 Correct 23 ms 16808 KB Output is correct
10 Correct 23 ms 16748 KB Output is correct
11 Correct 23 ms 16844 KB Output is correct
12 Correct 23 ms 16840 KB Output is correct
13 Correct 24 ms 16704 KB Output is correct
14 Correct 23 ms 16772 KB Output is correct
15 Correct 23 ms 16824 KB Output is correct
16 Correct 24 ms 16776 KB Output is correct
17 Correct 23 ms 16792 KB Output is correct
18 Correct 24 ms 16784 KB Output is correct
19 Correct 24 ms 16704 KB Output is correct
20 Correct 24 ms 16820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 16840 KB Output is correct
2 Correct 24 ms 16724 KB Output is correct
3 Correct 24 ms 16744 KB Output is correct
4 Correct 88 ms 16808 KB Output is correct
5 Correct 856 ms 16784 KB Output is correct
6 Execution timed out 1059 ms 16764 KB Time limit exceeded
7 Halted 0 ms 0 KB -