-
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
-
两个整数n(2<=n<=1000),a(2<=a<=1000)
-
一个整数.
-
6 10
-
1
-
结题思路:
-
在c语言中,1000!太大,不能直接计算,一般的处理也不行。
-
一种可行的方法是:将1、2、...n分别进行素数分解,得出每个素数用到的次数记录到数组an[]中,然后对a进行素数分解,同样记录下各个素数用到的次数到数组bn[]中,要找需要的k,遍历an与bn,对bn[i]不为零,若an[i]为零,则k=0,若an[i]不为零,则min{an[i]/bn[i]}即为k,若bn[i]==0,则不用考虑。
-
ac代码
-
#include <iostream> #define MAX 1005 #define INF 10000005 using namespace std; int sushu(int x); int a[MAX]; int an[MAX]; int bn[MAX]; int a_number = -1; int main() { for(int i=2; i<1000; i++) if(sushu(i)) a[++a_number] = i; int n,s; while(cin >> n >> s) { int flag = 0; for(int i=0; i<1000; i++) { an[i] = 0; bn[i] = 0; } for(int i=1; i<=n; i++) { int temp = i; for(int j = a_number; j>=0; j--) { if(!(temp%a[j])) { temp /= a[j]; an[j++]++; } if(temp<2) break; } } int temp = s; for(int j = a_number; j>=0; j--) { if(!(temp%a[j])) { temp /= a[j]; bn[j++]++; } if(temp<2) break; } for(int i=0;i<=a_number;i++) if(bn[i]) { if(!an[i]) { flag = 1; break; } an[i] = an[i]/bn[i]; } else an[i] = INF; if(flag) { cout << 0<< endl; continue; } int minn = INF; for(int i=0;i<=a_number;i++) if(minn>an[i]) minn = an[i]; cout<<minn<<endl; } return 0; } int sushu(int x) { for(int i=2; i<x; i++) if(!(x%i)) return 0; return 1; }
链接
http://ac.jobdu.com/problem.php?pid=1104
题目描述:
-
输入:
-
输出:
-
样例输入:
-
样例输出: