數論 素數篩,phi P3601簽到題

2022-05-05 16:12:08 字數 925 閱讀 1081

題目描述

給出l,r,要求求出\(\sum_^r (i - phi[i]) mod 666623333\)

\(1\leq l\leq r\leq 10^\),\(r - l \leq 10^6\)

對於乙個數n,肯定有至少乙個小於等於$\sqrt n $的(質)因子。因為 \(r \leq 10^\),所以可以先預處理\(10^\)以內的素數, 然後利用r - l比較小的條件,乙個乙個數篩一遍就是了。用每個質因子去篩l - r之間的數,同時求出每個數的phi。對於個別的大於\(\sqrt n\)的因子,最後特判就行了。

\(\phi (x) = n (1 - \frac )(1 - \frac )...(1 - \frac )\)

#include #include using namespace std;

inline long long read()

const int mod = 666623333;

long long l, r, ans;

int pri[1000006], cnt;

long long k[1000006], phi[1000006];//k記錄原來的數

bool b[1000006];

inline void get_pri()

int main()

for (long long i = l; i <= r; (ans += i - phi[i - l]) %= mod, ++i)//寫的有點非人類hhh

if (k[i - l] != 1) phi[i - l] = phi[i - l] / k[i - l] * (k[i - l] - 1);

//特判

printf("%lld\n", ans);

return 0;

}

數論2 素數篩

判斷素數可通過試除小於 sqrt n 的素數來實現,那麼將其反過來,只要將 sqrt n 的素數的倍數都刪掉,那麼就能得到一張 n 的素數表,o n lg lg n 需劃掉合數,所以最初假設均為素數,即陣列初始化為0 bool composite maxn void generate int n f...

數論 快速冪,素數篩

int qupow int a,int b,int m return ans 位運算 為 int qupow int a,int b,int m return ans 快速冪將原來0 b 的時間複雜度降為了o logb 首先我們在一般方式求素數時,可以採用以下方式 bool ifprime int ...

數論 C 線性篩素數

在c 中,篩素數是乙個非常重要演算法。我花了半天時間才明白的尤拉篩 我實在是太蒻了 最愚蠢的方法 1 include2 intmain 10 11 printf no 12 普通方法 1 include2 intmain 10 11 printf no 12 以上兩種方法其實都是判定方法,並不是篩法...