2017ccpc Hangzhou B. Mestre em Phi (derivação da fórmula hdu6265)

 

 Significado da pergunta: pergunte ∑ d | n φ (d) × nd

método um:

A partir do  \ varphi (n) = n \ prod_ {p | n} (1 - \ frac {1} {p})  disponível  n \ sum_ {d | n} \ varphi (d) \ times \ frac {n} {d} = n \ times \ sum_ {d | n} \ prod_ {p | d} (1 - \ frac {1} { p}) , enumere a combinação de m números primos, pré-processamento  q [i] * (1 - \ frac {1} {p [i]}), complexidade 2 ^ {20}

Corre muito rápido, não está preso?

Método dois:

Empurre a fórmula, coo

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
int p[25], q[25];
ll pp[25];

ll qpow(ll a, ll b){
	ll ans = 1;
	while(b > 0){
		if(b & 1){
			ans = ans * a % mod;
		}
		a = a * a % mod;
		b >>= 1;
	}
	return ans % mod;
}

int m;
ll ans, n;

void dfs(int now, ll res) {
    if(now == m + 1) {
        ans = (ans + res) % mod;
        return ;
    }
    dfs(now + 1, res);
    dfs(now + 1, res * pp[now] % mod);
}

signed main()
{
	int t;
	scanf("%d", &t);
	while(t--) {
		ans = 0;
		n = 1;
		scanf("%d", &m);
		for(int i = 1; i <= m; i++) {
			scanf("%d%d", &p[i], &q[i]);
			n = n * qpow(1ll * p[i], 1ll * q[i]) % mod;
		}
        for(int i = 1; i <= m; ++i)
            pp[i] = (p[i] - 1) * qpow(1ll * p[i], mod - 2) % mod * q[i] % mod;
		dfs(1, 1);
		printf("%lld\n", n * ans % mod);
	}
}

 

Acho que você gosta

Origin blog.csdn.net/weixin_43871207/article/details/109524462
Recomendado
Clasificación