欢迎访问我的新博客:http://www.milkcu.com/blog/

原文地址:http://www.milkcu.com/blog/archives/uva10139.html

原创:

作者:MilkCu

题目描述

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!

解题思路

思路比较流畅,依次求2~n之间的数与m的最大公约数,然后用公约数去除m。

若m能被除尽,则m可以整除n!;否则不能。

但是提交到UVaOJ为什么会超时呢?看来还需要优化。



如果在遍历2~n之间的数时,遇到的数i为质数。

若m为素数且m>n,则m与2~n中的任何数互素。

其他优化:把开方放在循环外边。

从n到2递减寻找最大公约数可以提高效率。



还要注意特殊情况的处理。



PC可以通过,UVaOJ总是超时,太浪费时间了。

对于我的不高的要求,以后使用PC吧。

两种求最大公约数的方法:

1. 递归

int gcd(int a, int b) {
if(b == 0) {
return a;
}
if(a < b) {
return gcd(b, a);
}
return gcd(b, a % b);
}

2. 循环

int gcd(int a, int b) {
if(a < b) {
int tmp = a;
a = b;
b = tmp;
}
while(b > 0) {
int tmp = a;
a = b;
b = tmp % b;
}
return a;
}

代码实现

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int isPrime(int x) {
int sq = sqrt(x);
for(int i = 2; i <= sq; i++) {
if(x % i == 0) {
return 0;
}
}
return 1;
}
int gcd(int a, int b) {
if(a < b) {
int tmp = a;
a = b;
b = tmp;
}
while(b > 0) {
int tmp = a;
a = b;
b = tmp % b;
}
return a;
}
int main(void) {
int n, m;
while(cin >> n >> m) {
if(m == 0) {
cout << m << " does not divide " << n << "!" << endl;
continue;
}
if(m == 1) {
cout << m << " divides " << n << "!" << endl;
continue;
}
if(isPrime(m) && m > n) {
cout << m << " does not divide " << n << "!" << endl;
continue;
}
int tm = m;
for(int i = n; i >= 2; i--) {
int g = gcd(i, tm);
if(g > 1) {
//cout << i << " " << g << endl;
tm /= g;
}
if(tm == 1) {
cout << m << " divides " << n << "!" << endl;
break;
}
}
if(tm != 1) {
cout << m << " does not divide " << n << "!" << endl;
}
}
return 0;
}

(全文完)

本文地址:http://blog.csdn.net/milkcu/article/details/23592449

Factovisors - PC110704的更多相关文章

  1. UVA 10139 Factovisors(数论)

    Factovisors The factorial function, n! is defined thus for n a non-negative integer: 0! = 1 n! = n * ...

  2. poj 2649 Factovisors 对n!进行因数分解

    Factovisors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4431   Accepted: 1086 Descr ...

  3. Kattis之旅——Factovisors

    The factorial function, n! is defined thus for n a non-negative integer: 0! = 1 n! = n * (n-1)! (n & ...

  4. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  5. ACM训练计划step 1 [非原创]

    (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成 ...

  6. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  7. 开涛spring3(9.3) - Spring的事务 之 9.3 编程式事务

    9.3  编程式事务 9.3.1  编程式事务概述 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理. Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是 ...

  8. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  9. 从“n!末尾有多少个0”谈起

    在学习循环控制结构的时候,我们经常会看到这样一道例题或习题.问n!末尾有多少个0?POJ 1401就是这样的一道题. [例1]Factorial (POJ 1401). Description The ...

随机推荐

  1. Memcache功能具体解释

    memcache函数全部的方法列表例如以下: Memcache::add – 加入一个值.假设已经存在,则返回false Memcache::addServer – 加入一个可供使用的server地址 ...

  2. jsp 说明标签

    page指令 Page指令用来定义整个JSP页面的一些属性和这些属性的值. 比如我们能够用page指令定义JSP页面的contentType属性的值是text/html;charset=GB2312, ...

  3. redis权限认证(设置密码)的方法

    redis可以通过设置密码来增强安全强度.除了设置密码,我们还可以通过修改redis的默认端口.对端口做防火墙等.那么如何开启redis的密码功能呢?以下就是详细的步骤方法: 打开redis.conf ...

  4. Asp.Net MVC 2.0 Filter基本用法

    在这一节里,大家一同学习下mvc 2.0中的filter,简单的说,filter就是标记在action上的一些属性,来实现对action的控制. mvc2.0中主要包括以下filter 1. Auth ...

  5. Skype发布视频API

    原文:Skype发布视频API 相信很多人对Skype多少都应该有一些了解,如果以前没有使用过它的服务的话,也应该在最近的新闻中听说过它的大名.因为,它和我们每天都在接触的公司--Mircrosoft ...

  6. UVA 11426 - GCD - Extreme (II) (数论)

    UVA 11426 - GCD - Extreme (II) 题目链接 题意:给定N.求∑i<=ni=1∑j<nj=1gcd(i,j)的值. 思路:lrj白书上的例题,设f(n) = gc ...

  7. Java 测试并行编程(三)

    有很多其他的交替运行 因为在并行代码中的错误一般是低概率事件.因此,试运行并发差错时需要反复多次,但是,有很多方法可以提高发现这些错误的概率 ,在前面提到的,在多处理器系统.假设 线程的数量,那么 与 ...

  8. iOS_文章3党库SDWebImage

    1,下载的文章3党库SDWebImage代码包增加到project 2,进入project的Build Phases,将源代码包里面的所有.m文件所有加入到project 3,导入第3方类库依赖的两个 ...

  9. easyui datagrid shift 多选

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...

  10. Swift入门教程:基本语法(二)

    数字格式 数字可以增加额外的格式,使它们更容易阅读 可以增加额外的零 0 let money = 001999           // 1999 let money2 = 001999.000   ...