24h購物| | PChome| 登入
2012-09-19 22:08:35| 人氣1,341| 回應0 | 上一篇 | 下一篇

[UVA] 10139 - Factovisors

推薦 0 收藏 0 轉貼0 訂閱站台

Problem D: Factovisors

The factorial function, n! is defined thus for n a non-negative integer:
   0! = 1
   n! = n * (n-1)!   (n > 0)
We say that a divides b if there exists an integer k such that
   k*a = b
The input to your program consists of several lines, each containing two non-negative integers, n and m, both less than 2^31. For each input line, output a line stating whether or not m divides n!, in the format shown below.

Sample Input

6 9
6 27
20 10000
20 100000
1000 1009

Output for Sample Input

9 divides 6!
27 does not divide 6!
10000 divides 20!
100000 does not divide 20!
1009 does not divide 1000!

#include <stdio.h>
int p[5500], pt = 0;
void sieve() {
int i, j, m[50000] = {};
for(i = 2; i < 50000; i++)
if(m[i] == 0) {
p[pt++] = i;
for(j = i+i; j < 50000; j += i)
m[j] = 1;
}
}
int solve(int n, int m) {
int i;
for(i = 0; i < pt && p[i]*p[i] <= m; i++) {
if(m%p[i] == 0) {
int cnt = 0;
while(m%p[i] == 0)
cnt++, m /= p[i];
long long tmp = p[i], cnt2 = 0;
while(tmp <= n) {
cnt2 += n/tmp;
tmp *= p[i];
}
if(cnt2 < cnt) return 0;
}
}
if(m != 1) {
if(n < m) return 0;
}
return 1;
}
int main() {
sieve();
int n, m;
while(scanf("%d %d", &n, &m) == 2) {
if(solve(n, m))
printf("%d divides %d!\n", m, n);
else
printf("%d does not divide %d!\n", m, n);
}
return 0;
}
 

台長: Morris
人氣(1,341) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: UVA |
此分類下一篇:[UVA][凸凹形判斷] 10078 - The Art Gallery
此分類上一篇:[UVA][dp][java] 10069 - Distinct Subsequences

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文