返回(1~n)与n互质的数的个数
ll eular(ll n) { ll ans = n; for(int i=2;i*i <= n;i++){ if(n%i == 0){ ans = ans - ans/i; //p(n) = (p - p/p1)(1 - 1/p2)...... while(n%i == 0) n = n/i; } } if(n > 1) //存在大于sqrt(a)的质因子 ans = ans - ans/n; return ans; }
欧拉打表
void SE()//select euler//类似于素数筛选法 { int i,j; euler[1] = 1; for(i = 2;i < Max; ++i) euler[i]=i; for(i = 2;i < Max; ++i) { if(euler[i] == i)//这里出现的肯定是素数 { for(j = i; j < Max; j += i)//然后更新含有它的数 { euler[j] = euler[j]/i*(i - 1); // n*(1 - 1/p1)....*(1 - 1/pk).先除后乘 } } } //for (int i = 1; i <= 20; ++i) printf("%d ",euler[i]);
——mark一下