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
310 5 10
10 1 2
10 2 8
sample output
1ac**: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;
}
#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 不...