オイラー関数の使用

https://www.cnblogs.com/handsomecui/p/4755455.htmlから転載
オイラー関数テンプレート
オイラー関数は偶数でなければならない
(1)n以下でnに比較的素数の数を直接見つける:

int Euler(int n)

{

int ret=n;

for(int i=2;i<=sqrt(n);i++)

 if(n%i==0)

  {

    ret=ret/i*(i-1);//先进行除法防止溢出(ret=ret*(1-1/p(i)))

    while(n%i==0)

      n/=i;

 }

if(n>1)

      ret=ret/n*(n-1);

    return ret;

}
//
ll phi(ll n)//オイラー関数値を検索
{
int ans = n、temp = n;
for(int i = 2; i * i <= temp; i ++)
{
if(temp%i0)
{
ans- = ans / i;
while(temp%i
0)temp / = i;
}
}
if(temp> 1)ans- = ans / temp;
ansを返します。
}

スクリーニングテンプレート:[1、n]の間の各数値の素因数を見つける

#defineサイズ1000001

int euler [size];

void Init()

{

 memset(euler,0,sizeof(euler));

      euler[1]=1;

 for(int i=2;i<size;i++)

   if(!euler[i])

   for(int j=i;j<size;j+=i)

   {

          if(!euler[j])

           euler[j]=j;

           euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出

     }

}

おすすめ

転載: blog.csdn.net/qq_43458555/article/details/86601022