csu(尤拉函式 篩素數)

2021-06-21 21:00:38 字數 1377 閱讀 9228

這真是一道好題啊!讓我wa了那麼多次,wa的原因是:大於根號n的質因子有且只有乙個,而我一開始都不懂這一點;

題目鏈結

題意:輸入乙個n,a是n的所有因子之和,b是所有與n互質的數之和,求a - b

b比較容易求,所以先分析一下如何求b,首先我們要知道乙個結論如果x與n互質,那麼n-x與n也互質,所以b = n * phi(n)/2;

然後求a,先求n的所有素因子分別為,p1,p2......pk,對應的個數為s1,s2,.......sk,舉乙個例子n = 12,那麼素因子有2,3  ,對應的個數為2,1;

下面是**:

#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long  

#define n 100000 + 10

#define eps 1e-9

#define pi acos(-1.0)

#define p system("pause")

using namespace std;

bool vis[n];

int prime[n],number[n];

int euler_phi(int n)

}

if( n > 1) ans = ans / n * (n - 1);

return ans;

}

//求10^5之間的素數

void sieve(int n)

int gen_primes(int n)

ll pow(int a,int n)

struct node

s[n];

int main()

//for(int i = 1; i < n; i++)

// cout<1 && i < c)

i++;

} // cout<= prime[i]; i++)

a = a * (ll)( (pow(prime[i],number[i]+1) - 1 ) / (ll)(prime[i] - 1));

if(n > 1) //比根號n大的質因子只有乙個,這是關鍵地方

a = a * (ll)(1 - (ll)n*(ll)n)/(ll)(1 - n);

//cout<

尤拉函式 素數篩

尤拉發現求小於等於n的正整數中有多少個數與n互質可以用這個公式 euler x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有素因數,x是不為0的整數。euler 1 1 唯一和1互質的數就是1本身 尤拉公式的延伸 乙個數的所有質因子之和是e...

埃及篩素數 尤拉篩函式

線性篩素數 prime陣列中的素數是遞增的,當i能整除prime j 那麼i prime j 1 這個合數肯定被prime j 乘以某個數篩掉。因為i中含有prime j prime j 比prime j 1 小,即i k prime j 那麼i prime j 1 k prime j prime ...

由素數篩法到尤拉函式(尤拉函式,線性篩)

蒟蒻最近準備狂補數學啦tat 基於篩素數,可以同時快速求出尤拉函式。於是蒟蒻準備從這裡入手,整理一下實現的思路。傳統篩素數的做法 埃式篩 是,利用已知的素數,去篩掉含有此質因子的合數,十分巧妙。由於不是本文的重點,就只貼一下 吧 include include define r register i...