hdu 4135 容斥原理

2021-06-23 02:28:45 字數 663 閱讀 8967

剛接觸,有關因子個數的增加不太弄得好,然後看到了這個神奇的遞迴:

ac**

#include#includeusing namespace std;

#define ll long long

ll a,b,ansa,ansb,ans,p[100],up;

void dfs(int n,bool tag,ll num)

else

return ;

}dfs(n+1,tag,num); //1

dfs(n+1,!tag,num*p[n]);//2

}int main()

}if(k!=1)

p[up++]=k;

dfs(0,0,1);

printf("case #%d: %i64d\n",ca++,ansb-ansa);

}return 0;

}

這個遞迴很巧妙

每一次遞迴都經過1的話就是結果只有對dfs(0,0,1)的1進行操作,就相當於容斥原理裡面的第一層,因子只有乙個 ,奇數個因子加,

如果第一次遞迴走第一層,第二次走第二層,或第三次走第二層....(以此類推)就是容斥原理裡面因子有2個的那種情況了,

這個遞推式就像樹一樣的層層展開,很巧妙!

hdu4135 容斥原理

題意 給出a,b,n,求出 a,b 範圍內與n互素的數字的個數。即b範圍內的不與n互素的數減去a範圍內不與n互素的數,把 1,a 1,b 中不與n互素的數分別求出來,再減掉就是和n互素的數了。那麼首先將n分解質因數,因子和因子的倍數可以被除盡,一定不與n互素,把這些數都記下來,篩法求素數即可 然後把...

hdu 4135 容斥原理

題意 就是讓你求 a,b 區間於n互質的數的個數.分析 我們可以先轉化下 用 1,b 區間與n互質的數的個數減去 1,a 1 區間與n互質的數的個數,那麼現在就轉化成求 1,m 區間於n互質的數的個數,如果要求的是 1,n 區間與n互質的數的個數的話,我們直接求出n的尤拉函式值即可,可是這裡是行不通...

hdu 4135,數學 容斥

題意 求 a,b 區間裡面,與c互質的數的個數。範圍 0分析 先將c分解質因數,根據c的範圍可以判斷質數的範圍不超過x個。x 自己線性篩素數後,從小到大乘一下,看當乘到多少個的時候,積大於10 9,則可以判斷c的最多質因數個數 假設c的質因數有2,3,5 則 a,b 區間裡,包含質因數2的數的個數為...