這真是一道好題啊!讓我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...