积性函数,线性筛入门 HDU - 2879

HDU - 2879HeHe

  题意:He[N]为[0,N−1]范围内有多少个数满足式子x2≡x (mod N),求HeHe[N]=He[1]×……×He[N]

  我是通过打表发现的he[x]=2k,k为x是质因子个数,不过这是可以通过积性函数证明的。

  关于积性函数的定义:

对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时,f(ab)=f(a)f(b),在数论上就称它为积性函数。若对于某积性函数 f(n) ,就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的。

  引用证明,HDU 2879 HeHe (素数+积性函数及证明)

  知道了,he[x]=2k之后,接下来求hehe[n]其实就是求2k1+k2+...kn,具体实现上,有好几种方法。

  普通的埃氏筛,对于每个数它的每个质因子就在指数贡献一个了1,所以我们可以先把质数筛出来,然后再看n范围内包含有多少个这个质数的倍数。

 1 #include<cstdio>
 2 typedef long long ll;
 3 const int N=10000007;
 4 bool nop[N]={false};
 5 int pn,pri[N/10];
 6 void init()
 7 {
 8     pn=0;
 9     for(int i=2;i<N;i++)
10     {
11         if(!nop[i])
12         {
13             pri[pn++]=i;
14             for(int j=i<<1;j<N;j+=i)
15                 nop[j]=true;
16         }
17     }
18 }
19 ll pow(int b,int mod)
20 {
21     ll ans=1,a=2ll;
22     while(b)
23     {
24         if(b&1)
25             ans=(ans*a)%mod;
26         a=(a*a)%mod;
27         b>>=1;
28     }
29     return ans%mod;
30 }
31 int main()
32 {
33     init();
34     int t,n,m;
35     scanf("%d",&t);
36     while(t--)
37     {
38         scanf("%d%d",&n,&m);
39         int sum=0;
40         for(int i=0;i<pn&&pri[i]<=n;i++)
41             sum+=n/pri[i];
42         printf("%lld\n",pow(sum,m));
43     }
44     return 0;
45 }

埃氏筛

  第二个线性筛(欧拉筛),为什么欧拉筛是O(n),,可以看这个证明线性筛(欧拉筛)然后,前面有证明he是积性函数,所有我们就可以通过欧拉筛先把he预处理处理。

#include<cstdio>
typedef long long ll;
const int N=10000007;
bool nop[N]={false};
int pn,pri[N/10],he[N];
void init()
{
    pn=0;
    for(int i=2;i<N;i++)
    {
        if(!nop[i])
        {
            he[i]=1;//he[i]=2^1,
            pri[pn++]=i;
        }
        for(int j=0;j<pn&&1ll*i*pri[j]<N;j++)
        {
            int temp=i*pri[j];
            nop[temp]=true;
            if(i%pri[j]==0)
            {
                he[temp]=he[i];//temp的质因子数跟i相同
                break;
            }
            he[temp]=he[i]+he[pri[j]];//f[a*b]=f[a]*fa[b],
            //这里he保存的是指数,所以是+
        }
    }
}
ll pow(int b,int mod)
{
    ll ans=1,a=2ll;
    while(b)
    {
        if(b&1)
            ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ans%mod;
}
int main()
{
    init();
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        int sum=0;
        for(int i=1;i<=n;i++)
            sum+=he[i];
        printf("%lld\n",pow(sum,m));
    }
    return 0;
}

欧拉筛

原文地址:https://www.cnblogs.com/LMCC1108/p/11089153.html

时间: 2024-08-25 02:34:32

积性函数,线性筛入门 HDU - 2879的相关文章

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

线性筛 埃氏筛 对于每个数x,枚举其倍数,将kx筛去. 在埃氏筛过程中,每个数都会被筛掉多次,且对于每个数x,枚举其倍数的次数为\(\frac{n}{x}\) 故埃氏筛的时间复杂度为\(\sum_{i=1}^{n}\)\(\frac{n}{i}\)=n\(\sum_{i=1}^{n}\)\(\frac{1}{i}\)=\(n ln(n)\) 欧拉筛 在埃氏筛中,每个数会被筛掉多次,想要进一步下降复杂度,我们要求每个数只会被筛一次. 要想将多种筛去x的方法固定(唯一).我们就要采用一种方法-"最小

bzoj 2693: jzptab 线性筛积性函数

2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 444  Solved: 174[Submit][Status][Discuss] Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sample Output 122 HINT T <= 10000 N, M<=10000000

HDU 4002 Find the maximum (欧拉函数-积性函数的性质(2011年大连赛区网络赛第二题)

[题目链接]:click here~~ [题目大意]: 给出一个整数n,求一个数x,x在1到n之间,并且x/φ(x)最大(其中φ(x)为x的欧拉函数). [思路]: 由欧拉函数为积性函数,即:如果 则有: 且: 则有: 要使f(x)最大,须使x含尽量多的不同素数因子. 代码: /* * Problem: HDU No.4002 * Running time: 1700MS * Complier: java * Author: javaherongwei * Create Time: 0:08 2

读贾志鹏《线性筛法与积性函数》笔记

1.欧拉筛法在线性时间内求素数以及欧拉函数 代码: 1 procedure get; 2 var i,j,k:longint; 3 begin 4 tot:=0; 5 fillchar(check,sizeof(check),false); 6 for i:=2 to n do 7 begin 8 if not(check[i]) then 9 begin 10 inc(tot); 11 p[tot]:=i; 12 fai[i]:=i-1; 13 end; 14 for j:=1 to tot

常用积性函数的线性筛法整理

简单整理推导加代码,留复习用. 线性筛素数 最简单也最基础,直接看代码就好了\(--\) code: void Euler_Phi_Prime(int n) { is_prime[1] = true; for (int i = 2; i <= n; i++) { if (!is_prime[i]) prime[++cnt] = i; for (int j = 1; j <= cnt && i * prime[j] <= n; j++) { is_prime[i * pri

HDU 1452 Happy 2004(因子和的积性函数)

题目链接 题意 : 给你一个X,让你求出2004的X次方的所有因子之和,然后对29取余. 思路 : 原来这就是积性函数,点这里这里这里,这里讲得很详细. 在非数论的领域,积性函数指所有对于任何a,b都有性质f(ab)=f(a)f(b)的函数. 在数论中的积性函数:对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数. 若对于某积性函数 f(n),就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的. s(

bzoj 4407 于神之怒加强版 —— 反演+筛积性函数

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4407 推导如这里:https://www.cnblogs.com/clrs97/p/5191506.html 然后发现 \( F(D) \) 是一个积性函数,可以筛质数的同时筛出来: 首先,单个质数 \( p \) 时只有 \( d=1 \) 和 \( d=p \) 两个因数,所以 \( F[p] = p^{k} - 1 \) 然后如果筛到互质的数,直接把 \( F() \) 相乘即可:

hdu2421-Deciphering Password-(欧拉筛+唯一分解定理+积性函数+立方求和公式)

Deciphering Password Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2357    Accepted Submission(s): 670 Problem Description Xiaoming has just come up with a new way for encryption, by calculati

积性函数求和:筛法DP、洲阁筛

如果定义在正整数集上的函数 $f(n)$ 满足对于任意一对互素正整数 $n, m$ 都有 $f(n)f(m)=f(nm)$, 那么 $f$ 就叫做积性函数. 积性函数又可以表示为,假设 $n$ 的素因子分解式为 $n=\prod_{i=1}^mp_i^{c_i}$, 那么 $f(n)=\prod_{i=1}^mg(p_i, c_i)$. 本文讨论的函数满足:$g(p, c)$ 能够快速求单点值,且 $g(x, 1)$ 是关于 $x$ 的低次多项式. 积性函数求和,就是要求出 $\sum_{n=1