HDU 4279 Number 數論 簡證

2021-06-09 11:15:05 字數 1450 閱讀 9733

題意: 給出乙個f(x), 表示不大於x的正整數裡,不整除x 且 跟x有大於1的公約數 的數的個數。定義f(x), 為不大於x的正整數裡,滿足f(x)的值為奇數的數的個數。題目就是求這個f。

分析:打表找規律的方法我就不說了。這裡我們來簡單推理證明下。

先來看f(x),「不整除x」 等同於 不是x的約數,「跟x有大於1的公約數」 等同於 不是x的互質數。而且從f的定義知道,我們只需要考慮f(x)的奇偶性即可。

所以,f(x) = x - 約數個數 - 互質數個數 +1。最後+1是因為,1是約束也是互質數,減了兩次所以補回來。

約數個數,我們由基本定理可得,x可寫成質數冪累乘的形式,而由計數方法易知 x的約數個數為 (質數的冪+1)的累乘。所以若要使約數為奇數,充要條件是(質數的冪+1)都為奇數,即質數的冪都為偶數。所以此時 x必然是乙個平方數。綜上,x為平方數,其約數個數為奇數;x為非平方數,其約數個數為偶數

互質數個數,我們自然聯想到尤拉函式。

尤拉函式的值為 不大於n的正整數中與n互質的數的個數。這不就是互質數個數麼?而且可以證明,尤拉函式在n>2時,值都為偶數。

所以,當x>2時, 若x為平方數,f(x)=x-奇-偶+1,要使f(x)為奇數,則x必為奇數;若x為非平方數,f(x)=x-偶-偶+1,要使f(x)為奇數,則x必為偶數。 當x=1或2時,f(x)=0.

綜上,f(x)的值為[3,x]中,奇數平方數+偶數非平方數的個數和,即偶數個數-偶數^2的個數+奇數^2的個數

而偶數個數為 x/2-1,-1是為了把2減掉。偶數^2個數為 sqrt(x)/2,奇數^2個數為 ( sqrt(x)-(sqrt(x)/2) )-1,這裡-1是為了把1減掉。

所以,化簡後,f(x) = x/2-1+(sqrt(x)%2? 0: -1).

至此推證完畢。

另外,這題不管我怎麼改,用c++交始終是wa(無力吐槽杭電的int64)。。不知道為什麼,如果有人有c++能ac的**,麻煩提供一下,非常感謝~

還有一點就是,x要轉成long double後再開根號,或者直接 x*1.0 。用double會wa。。

**:#include#include#include#include#include#include#include#includeusing namespace std;

inline int rint()

inline int max(int x, int y)

inline int min(int x, int y) { return (x=(b);i--)

#define rep(x) for(int i=0; i<(x); i++)

typedef __int64 int64;

#define inf (1<<30)

const double eps = 1e-8;

#define bug(s) cout<<#s<<"="<

hdu 1066 數論 遞迴

hdu 1066 last non zero digit in n 起首引用下leemars的呈報 因為 2 n 是以4為輪迴節的 並且table n 是以10為輪迴節的 所以從10開端 f n 5 table n的尾數 6 f n n 10 2 n 5 mod 4 右邊的式子除了f n 5 外 是...

HDU1215 數論解法

題意 給出乙個正整數n,求出不包含它本身的所有因子的和 思路 運用算術基本定理對這個這個整數進行拆分 整數約數和公式即,sum 1 p1 p1 2 p1 a1 1 p2 p2 2 p2 a2 1 pk pk 2 pk ak 注 該公式計算結果包含整數本身 include include includ...

HDU 6129 規律 數論

給出一串長度為n的序列a,現在對a求m次字首異或和,求最後得到的陣列。題目不長,但其實隱藏了很多知識點。首先寫幾行找找規律 a b c d a ab abc abcd a aab aaabbc aaaabbbccd a aaab aaaaaabbbc aaaaaaaaaabbbbbbcccd 如果只...