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=1nj=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)=dndk 表示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={ai1ik} 为 n 的所有因子的集合,集合 M = { b j ∣ 1 ≤ j ≤ k ′ } M=\\{b_j|1\\leq j \\leq k'\\} M={bj1jk}的所有因子的集合。

∵   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(唯一分解定理)

hdu 1425 Happy 2004

线性筛及其扩展-积性函数

Happy 2004 hdu1452

HDU 1452 Happy 2004 数论

引用向量的部分片段?