題意: 給出乙個f(x),表示不大於x的正整數裡,不整除x且跟x有大於1的公約數的數的個數。定義f(x),為不大於x的正整數裡,滿足f(x)的值為奇數的數的個數。題目就是求這個f(x)。
網上很多方法就是打表找規律,已經談不上是演算法了。
這裡我們可以來分析:
不整除x且跟x有大於1的公約數的數的個數 f(x)=x-約數個數-互質數個數+1 。
把x素因子分解,易知x的約數個數為(質數的冪+1)的累乘。所以若要使約數為奇數,充要條件是(質數的冪+1)都為奇
數,即質數的冪都為偶數。所以此時x必然是乙個平方數。
綜上,x為平方數,其約數個數為奇數;x為非平方數,其約數個數為偶數。
互質數個數,我們有尤拉函式。
這裡用到乙個結論:尤拉函式在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).
#include
#include
#include
#include
using namespace std;
typedef long long ll;
ll solve(ll n)
int main()
{ ll a,b,t;
cin>>t;
while(t--)
{cin>>a>>b;
cout<
2012天津網路賽的1004
本來以為有什麼好方法的,初看感覺是網路流可是不知道怎麼建圖,然後sphinx和我說可能是狀態壓縮,但是我狀態壓縮的複雜度有點高,是2的30次方,絕對超時,然後覺得這題實在想不出來去網上搜了一下發現真的有人用狀態壓縮過了,覺得有點不可思議,我敲了一下沒想到也過了。c 的輸入輸出無任何優化156ms1y...
fzyzojP1876 天津 泥人張
思路一 考慮lucas定理,mod 4意義下,每乙個組合數都不能是0 所以,把n變成 制數,然後數字dp即可 f i 0 1 0 1 2 3 表示,前i位,有沒有限制,mod 4 的值是0 1 2 3 發現,4 2 2,所以如果出現乙個0或者兩個2都可以 所以,簡化一下 f i 0 1 0 1 2 ...
2023年天津青少年排球後備人才冬令營開營
2019年天津青少年排球後備人才冬令營開營。鍾欣 攝 天津1月21日電 記者 張道正 2019年天津青少年排球後備人才冬令營21日在在中國排球學院開營。來自天津市多地區的45名適齡 球員 參加了本次冬令營。本次冬令營為期一周,學生們在這裡過集體生活,吃 住 練 都在排球學院內。為了辦好這次冬令營,天...