九度oj 题目1104:整除问题
2015-06-21 09:35
561 查看
链接
http://ac.jobdu.com/problem.php?pid=1104
题目描述:
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
输入:
两个整数n(2<=n<=1000),a(2<=a<=1000)
输出:
一个整数.
样例输入:
样例输出:
http://ac.jobdu.com/problem.php?pid=1104
题目描述:
给定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; }
相关文章推荐
- 一起talk GCC吧(第一回:GCC介绍)
- iPhone NetworkReachable
- hash
- 有几个开源的字比较工具
- 读后感
- VS2013将新建的源码文件的编码格式自动设置成UTF8
- JavaScript之事件总结
- win8/wp8学习资料
- COJ 0024 N皇后问题
- 归并排序求数组中的逆序对
- getResources()方法
- Windows10怎么自定义设置3D文字屏幕保护?
- 测试相关理解(三)—边界值分析方法
- Makefile中的=, :=, ?=, +=
- inputStream 与 String 的互相转换
- Java知多少(99)Graphics2D类的绘图方法
- 图 像处理相关研究
- solrj实现增量索引
- MySQL InnoDB存储引擎undo redo解析
- jdk环境配置