容斥原理求解1 r中和某個數m互質的數的個數

2021-09-28 18:25:56 字數 959 閱讀 2265

void

get_fac

(ll m)

//要找的m的素因子}if

(m>1)

fac[cnt++

]=m;

}

如果乙個數有m的素因子,那麼他就一定不和m互質,比如30的素因子有2,3,5,那麼所有2的倍數就不和30互質,同理3的倍數,5的倍數也不和30互質,這裡假設要求1~30內和30互質的數,那麼r=30.設x1是2在1到30中2的倍數的個數,則x1=15,同理對3,x2=10,對5,x3=6,對23,x4=5 ;對2 * 5,x5=3;對3 * 5,x6=2;對23*5,x7=1,所以和30不互質的數就有x1+x2+x3-(x4+x5+x6)+x7=22個,則與30互質的數就有8個,和30的尤拉函式值相等.

程式寫法:

1.dfs():在遞迴的每一層都決策一下這個數選不選,第幾層就是第幾個數.

void

dfs(

int pos,

int use,

int cur,

int up)

dfs(pos+

1,use+

1,cur*fac[pos]

,up)

;dfs

(pos+

1,use,cur,up);}

//呼叫形式:dfs(0,0,1,r); //(遞迴層數,用了的數的數量,1儲存每一項(即x1或x2..)的值,上限範圍);

2.位運算

ll find

(ll up)

//up表示上限

} res+

=(coun%2)

?up/p:

(-up/p);}

return up-res;

//res為和m不互質的數的個數,那麼up-res就是互質的數的個數

}

容斥原理應用 求1 r中有多少個數與n互素

問題 求1 r中有多少個數與n互素。對於這個問題由容斥原理,我們有3種寫法,其實效率差不多。分別是 dfs,佇列陣列,位運算。先說說位運算吧 用二進位制1,0來表示第幾個素因子是否被用到,如m 3,三個因子是2,3,5,則i 3時二進位制是011,表示第2 3個 因子被用到 ll solve ll ...

1 R語言介紹

注釋 賦值 檢視 設定當前工作目錄 getwd setwd wd workspace directory setwd c myproject project1 在獨立的目錄中儲存專案是個好主意。文字輸出 函式 skin filename 將輸出重定向到檔案 中。不加引數呼叫 skin 僅向圖形輸出。...

1R安裝環境

2進入 的cocoa gui資料夾中,r框架將安裝在 library frameworks中,tcl tk和texinfo將安裝在 usr local 在某些條件下你可以將其自由散布。用 license 或 licence 來看散布的詳細條件。r是個合作計畫,有許多人為之做出了貢獻.用 contri...