由於2<=n<=10^6,所以一般的求尤拉函式方法用不上,而我們可以根據他的乙個性質
設a為n的質因數,若(n % a == 0 && (n / a) % a == 0) 則有e(n)=e(n / a) * a;若(n % a == 0 && (n / a) % a != 0) 則有:e(n) = e(n / a) * (a - 1)。
進行求解,而現在首要的任務就是求質因數a,我們可以利用線性篩素數時產生的n最小素數,所以首先又要線性篩素數,這個dd以前聽過,但是一直沒有用過,今天利用大半個晚上好好學習了這種o(n)篩法,具體可以看我blog。
**實現:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define ll long long
#define pi acos(-1)
#define n 1000000+10
#define inf 999999999
#define eps 1e-8
//****************************************
//poj 2478
//****************************************
ll dp[n];
ll num,prime[n/3];
ll min_prime[n];
ll cnt;
bool is_prime[n];
void init()
{ ll i,j,k;
memset(is_prime,1,sizeof(is_prime));
cnt=0;
for(i=2;i<=n-10;i++)
{if(is_prime[i])prime[cnt++]=i;
for(j=0;j
尤拉函式 POJ 2478 尤拉篩法
通式 phi x x 1 frac 1 frac 1 frac cdots 1 frac 若n是質數p的k次冪 phi n p k p p 1 p 因為除了p的倍數外,其他數都跟n互質。設n為正整數,以 phi n 表示不超過n且與n互素的正整數的個數,稱為n的尤拉函式值,這裡函式 n n,n n ...
線性方法求尤拉數 POJ2478
1.當需要求1到n的尤拉數之和時用線性方法 本題 2.當需要求單個尤拉數但資料很大用標準方法求 例如 線性的方法求尤拉數 模板 include include define ll long long const int maxn 1000010 int dp maxn ll a maxn int m...
線性篩素數(尤拉篩)
尤拉篩是o n 複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。埃篩的基本思想是 素數的倍數一定是合數。尤拉篩基本思想是 任何數與素數的乘積一定是合數 演算法概述 遍歷 2,n 的所有數i,內層迴圈遍歷已經找到的素數prime j 將i prime j 標記為合數...