Happy 2004(代码+积性函数扩展)
Posted H-w-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Happy 2004(代码+积性函数扩展)相关的知识,希望对你有一定的参考价值。
Happy_2004
题意:
求 200 4 k 2004^k 2004k的全部因子的和,对 29 29 29取模
思路(详细解释在扩展):
积性函数,等比数列求和
C o d e Code Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+10;
const int inf = 0x7ffffff;
const int mod = 29;
ll qpow(ll x, ll y) {//快速幂
ll ans = 1;
while(y) {
if(y & 1) ans = ans * x % mod;
x = x * x % mod;
y >>= 1;
}
return ans;
}
ll cal(ll p, ll cnt) {//等比数列求和
if(cnt == 1) return p+1;
if(cnt == 0) return 1;
if(cnt % 2) {
return cal(p, cnt/2)%mod *(qpow(p, cnt/2+1) + 1ll) % mod;
}
else {
return (cal(p, cnt/2-1)%mod * (qpow(p, cnt/2+1) + 1ll) % mod + qpow(p, cnt/2)) % mod;
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
ll n;
while(cin >> n, n)
cout << cal(2ll, 2*n)*cal(3ll, n) % mod * cal(22ll, n) % mod << endl;
return 0;
}
扩展(因子和,积性函数)
n n n的全部因子之和是:
( 1 + p 1 + p 1 2 . . . + p 1 q 1 ) × ( 1 + p 2 + p 2 2 . . . + p 2 q 2 ) . . × ( 1 + p n + p n 2 . . . + p n q n ) (1+p_1+p_1^2...+p_1^{q_1})\\times(1+p_2+p_2^2...+p_2^{q_2})..\\times(1+p_n+p_n^2...+p_n^{q_n}) (1+p1+p12...+p1q1)×(1+p2+p22...+p2q2)..×(1+pn+pn2...+pnqn)
= ∏ i = 1 n ∑ j = 0 p i p i j =\\prod_{i=1}^n\\sum_{j=0}^{p_i}p_i^j =∏i=1n∑j=0pipij
用分治(一般都会取模)。
举例(首项为1,公比为p,长度5+1):
1 + p + p 2 + p 3 + p 4 + p 5 1 + p + p 2 + p 3 × ( 1 + p + p 2 ) ( 1 + p + p 2 ) × ( 1 + p 3 ) 1+p+p^2+p^3+p^4+p^5\\\\ 1+p+p^2+p^3\\times(1+p+p^2)\\\\ (1+p+p^2)\\times(1+p^3)\\\\ 1+p+p2+p3+p4+p51+p+p2+p3×(1+p+p2)(1+p+p2)×(1+p3)
分治,范围变小
同理:首项为 p p p或者其他。
上面的式子可以感性理解一下,对 n n n进行质因子分解。对质因子 p i p_i pi可以选择 [ 0 , q i ] [0,q_i] [0,qi]次来组成某个因子。
积性函数 σ \\sigma σ
σ : σ k ( n ) = ∑ d ∣ n d k \\sigma:\\sigma_k(n)=\\sum_{d|n}d^k σ:σk(n)=∑d∣ndk 表示n的所有因数的k次方之和(注意不是和的k次方)。证明如下:
需要证明: σ k ( n m ) = σ k ( n ) × σ k ( m ) ( k > = 0 ) \\sigma_k(nm)=\\sigma_k(n)\\times\\sigma_k(m)~~~(k>=0) σk(nm)=σk(n)×σk(m) (k>=0)
设集合 N = { a i ∣ 1 ≤ i ≤ k } N=\\{a_i|1\\leq i \\leq k\\} N={ai∣1≤i≤k} 为 n 的所有因子的集合,集合 M = { b j ∣ 1 ≤ j ≤ k ′ } M=\\{b_j|1\\leq j \\leq k'\\} M={bj∣1≤j≤k′}的所有因子的集合。
∵ gcd ( n , m ) = 1 \\because~\\gcd(n,m)=1 ∵ gcd(n,m)=1 ∴ g c d ( a i , b j ) = 1 \\therefore gcd(a_i,b_j)=1 ∴gcd(ai,bj)=1
∴ \\therefore ∴ N与 M的交集为空,即 ∀ i , j a i ≠ b j \\forall i,j~~~a_i\\neq b_j ∀i,HDU 1452 Happy 2004(唯一分解定理)