欢迎访问我的新博客: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. SpringMVC传参

    @Controller @RequestMapping("/user") public UserController extends BaseController{ @InitBi ...

  2. Linux在iptables教程基本应用防火墙

    iptables它是Linux防火墙软件经常使用,下面说一下iptables设备.删除iptables规则.iptables只要打开指定的port.iptables屏蔽指定ip.ip科和解锁.删除添加 ...

  3. Tips & Tricks:Apache log4j简明教程(二)

    在上一讲Apache log4j简明教程(一)中介绍了log4j的基本概念,配置文件,以及将日志写入文件的方法,并给出了一个详细的示例.这一讲,我在继续谈一谈如何使用log4j将日志写入MySQL数据 ...

  4. 用grunt搭建自动化的web前端开发环境

    用grunt搭建自动化的web前端开发环境 jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发 ...

  5. 华为G520联通版刷机包 基于MIUI CM11新 平稳 稳定

    ROM介绍 刷先配置双卡:"设定-安卓原生设置-双卡套-配置订阅",否则,无信号 使开发人员选项方法:"设定-安卓原生设置-关于手机-发布"连续点击版本 启用A ...

  6. CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)

    策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...

  7. yii 使用 mongodb 小工具 YiiMongoDbSuite

    YiiMongoDbSuite下载链接: http://www.yiiframework.com/extension/yiimongodbsuite/ 如果你的yii和mongodb它已经建立了一个良 ...

  8. 【Espruino】NO.15 nRF24L01+无线收发器

    http://blog.csdn.net/qwert1213131/article/details/35853747 本文属于个人理解,能力有限,纰漏在所难免,还望指正! [小鱼有点电] [Espru ...

  9. ZOJ3640之简单慨率DP

    Help Me Escape Time Limit: 2 Seconds      Memory Limit: 32768 KB Background     If thou doest well, ...

  10. 如何使用linq操作datatable进行分组

    使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作, ...