寒假安排 求n !中v因子的個數

2021-07-24 04:13:02 字數 1746 閱讀 3923

b - 寒假安排

time limit:1000msmemory limit:64000kb64bit io format:%lld & %llu

submit

status

practice

acdream 1084

description

寒假又快要到了,不過對於lzx來說,頭疼的事又來了,因為眾多的後宮都指望著能和lzx約會呢,lzx得安排好計畫才行。

假設lzx的後宮團有n個人,寒假共有m天,而每天只能跟一位後宮mm約會,並且由於後宮數量太過龐大了,而寒假的天數太少,所以lzx在寒假裡不會與乙個mm約會一次以上。現在lzx想要知道:寒假安排的方案數如果寫成k進製,末位會有多少個0。

input

輸入的第一行是乙個整數,為資料的組數t(t<=1000)。

每組資料佔一行,為3個正整數n、m和k(1<=m<=n<2^31,2<=k<2^31),意思如上文所述。

output

對於每組資料,輸出乙個數,為寒假安排的方案數寫成k進製末位的0的數目。

sample input

3

10 5 10

10 1 2

10 2 8

sample output

1

1看到題目的第一感覺是什麼?。。

當然是好幸福的皇上^@^(開個玩笑)

首先提煉題意,題目讓求出a(n,m)轉化為k進製後末尾有多少0,wow!好難的問題,沒什麼定理和模板可以直接

解決這樣的問題 啊,難道真要寫轉化進製的函式,加上組合數那可是要將高精度進行到底了,偉大的數學家們怎麼可以允許這種事發生呢!所以,我們要一步步進行轉化,直到轉化為我們能解決的問題

1.乙個n數轉化為k進製末尾0的個數就是n能整除的k的最高次冪

2.怎麼算乙個數n能整除k的最高次數呢?那就要用到唯一分解定理將k分解了,然後求n分解式中k的各個素因子個數,

v(n)/k(n)取得最小值時即是所求

3.還需要知道乙個公式就是求n!中k因子的個數

int

count

(int

n,int

k)return num;

}

ac**:

#include

#include

using namespace std;

int a[100000],b[100000],c[100000],t;

int count(int n,int k)//求n!中素因子k的個數

return num;

}void phi(int n)//將n素數分解並記錄它的所有素因子及出現次數

a[t]=i;

b[t]=sum;

if(n>1)

t++;}}

if(n>1)

b[t]=sum;}}

int main()

{int n,x,y,z;

cin>>n;

while(n--)

{scanf("%d%d%d",&x,&y,&z);

phi(z);

int min=(count(x,a[0])-count(x-y,a[0]))/b[0];//找到兩者差值的最小值即可

for(int i=1;i<=t;i++)

{if((count(x,a[i])-count(x-y,a[i]))/b[i]

求n 中因子k的個數

思路 求n的階乘某個因子k的個數,如果n比較小,可以直接算出來,但是如果n很大,此時n 超出了資料的表示範圍,這種直接求的方法肯定行不通。其實n 可以表示成統一的方式。n km m a 其中k是該因子,m n k,a是不含因子k的數的乘積 下面推導這個公式 n n n 1 n 2 3 2 1 k 2...

求n個數 1 n 的質因子

求n個數 1 n 的質因子,我用到了素數篩選法的思想,例如找到素數2,2是2,4,6,8,10 的質因子,3是3,6,9,12 的質因子,然後找到素數5,若是求乙個數n的質因子,請參考 include includeint a 10001 20 b 10001 b i 表示第i個數的質因子個數,a ...

線性篩高階 三 求N的因子個數

演算法思路 首先先完成線性篩函式,然後改寫 define max n 1000 int prime max n 5 void init for int j 1 j prime 0 j return 然後我們進行 公升級 那對於乙個合數能寫出兩個不互素因數積的情況呢 例如 12 2 6 2 和 6 不...