解法一:數論篩法+字首和
//其實題目中f[n]的值可理解為存在多少個整數對使a*b<=n
#include#define n 1007
#define maxn 1000005
using
namespace
std;
intf[maxn];
void procede(int n)//
預處理
}//此時f[n]理解為表示n的約數的個數,亦可以理解為表示存在多少對整數對(a,b)恰好滿足a*b=n f[1]=1,f[2]=2,f[3]=2,f[8]=4,f[10]=3
for(int j=1;j)
//f[n]此時表示存在多少對整數對(a,b)滿足a*b<=n,即求了一次字首和,f[1]=1,f[2]=3,f[3]=5
for(int j=1;j)}//
此時f[n]表示題目中的sum(1,n),即又求了一次字首和,f[1]=1,f[2]4,f[3]=9
intmain()
}
解法二:數論篩法+樹狀陣列
#include#include#define maxn 1000005
#define n 1007
using
namespace
std;
inta,b,c[maxn],f[maxn];
/*int f(int x)
*/效率太低tle
int lowbit(int
x)void add(int i,intd)}
int sum(int
i)
return s%n;
}void precede(int
n) }
for(int j=1;j)}//
數論篩法效率不會tle
intmain()
}
數論 埃氏篩法
這學期的離散數學課程學了一點初等數論,其中的埃氏篩法當時課上沒有太懂,課後看了 挑戰程式設計競賽 一書終於弄懂了。這本書確實很好!演算法簡潔優美。如果只對乙個整數進行素性測試,通常o n 的演算法就足夠了。但如果要對許多整數進行素性測試,則有更為高效的演算法,其中就包括埃拉託斯特尼篩法,簡稱埃氏篩法...
數論基礎 埃氏篩法 區間篩法(模板)
區間篩法 求n之前的所有素數 原理1.如果採用利用文章中第乙個o sqrt n 的演算法,進行n次迴圈即可得到答案。顯然,這樣o nsqrt n 肯定超時,所以我們需要進行優化。2.如果我們判斷出a是素數,那麼我們就可以確定a的倍數都是合數。因此可以將這些倍數刪除,這樣就可以去掉一些不必要的判斷。3...
在數論中使用篩法
篩法是乙個很方便,很快捷的方法,金典的演算法很多都是使用曬法來解決的。比如金典的求尤拉函式,求莫比烏斯函式,以及一些篩素數等。但是什麼型別的題目可以使用自己自創的篩法呢。1.最典型的函式型別 f x d xg x,d 這種型別的函式是金典的篩法使用。你可以這樣想,篩法的本質是列舉每個數的同時找到這個...