求 a, b 區間內與n互質的個數

2022-05-22 17:51:11 字數 1070 閱讀 1343

#include#include

#include

#include

using

namespace

std;

long

long s[1020

],k;

void prime(long

long m)//

求乙個數的素因子

}if(m>1

) s[k++]=m;

//printf("###\n");

}

long

long quc(long

long m)//

佇列陣列實現容斥原理

}for(i=1;i)

sum+=m/p[i];

return

sum;

}intmain()

}

當r特別大的時候,時間效率會非常低下,那麼我們可以考慮容斥定理。

容斥定理的思想:去求解原問題的逆問題−求區間[

1,r]中不與n互素的個數。

思路:首先求得n的所有素因子pi(i=1

...k), 通過二進位制列舉所有素因子的組合, 如果選取了奇數個素

因子,應該加上對應的個數,而如果是偶數, 則減去即可。

例如6既能2整除,也能被2∗3整除,所以應該剔除重複計數的部分(使用容斥定理)。

假設當前得到的素數組合是k, 那麼⌊rk⌋就是[

1,r]中能被k整除的數的個數。

詳細見容斥定理

詳細**如下

int solve(int r, int

n) }

if(n > 1) p.push_back(n); //

可能n也是素數

int sum = 0

;

for(int msk = 1; msk < (1

}int cur = r /mult;

if(bits & 1) sum +=cur;

else sum -=cur;

} return r -sum;

}

求區間(a,b)中與n的互質數

給定你乙個數n,請你統計出在 a,b 這個區間中和n互質的數的個數。兩個數互質當且僅當他們除了1之外沒有其他的公共因子或者他們最大的公共因子是1。1和任何數是互素的 假設m 12,n 30.第一步 求出n的質因子 2,3,5 第二步 1,m 中是n的因子的倍數當然就不互質了 2,4,6,8,10 n...

求a b中與n互質的數的個數

首先我們要會求1 m中與n不互質的數的個數。然後用b a 1 solve b solve a 1 即可。solve b 是指1 b中與n不互質的數的個數。不互質就說明有公共的質因子。那麼solve b 怎麼求呢?先把n的質因子全都篩出來存在乙個vector陣列裡,然後用容斥原理求即可。因為如果單把有...

尤拉函式(求與n互質的數的個數)

求解與n 1 n 1 互質的質因子的個數 注釋 解析 定義 對於正整數 n,n 是小於或等於 n的正整數中,與 n互質的數的數目。例如 8 4,因為1,3 5,7 均和8互質。性質 1.若 p是質數,p p 1.2.若n是質數p的 k次冪,n p 1 p k 1 因為除了 p的倍數都與 n互質 p ...