九度 1104 以及 辗转相除法的原理f昂发

//方法一
//对每个形如 (A*a+ B)* a^k的数,前面的A 没有意义的,只有B
//才有可能继续被用来作为未来的因子,所以每次只需要保留比a小的B 就够了。代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

#ifdef ONLINE_JUDGE
#define FINPUT(file)  0
#define FOUTPUT(file) 0
#else
#define FINPUT(file)  freopen(file,"r",stdin)
#define FOUTPUT(file) freopen(file,"w",stdout)
#endif

int main()
{
	FINPUT("in.txt");
    FOUTPUT("out.txt");

    int n,a,k;
    while(cin>>n>>a)
    {
    	k = 0;
    	long long int m=1;
    	for(int i=1;i<=n;i++)
    	{
    		m *= i;
    		while(m%a==0)
    		{
    			k++;
    			m/=a;
    		}
    		m %= a;  //这一行刚开始没有想好原理,后来看了别人的代码才明白
    	}
    	cout<<k<<endl;
    }
    return 0;
}

//方法二的算法思想
//1 先对a 进行质因数分解,得到 a = p1^k1 * p2^k2 * p3^k3.....
//2 对每一个质因子p,求 k(p) 使得 n!/p^k == 0 但 n!/p^(k+1) !=0 ,方法 [n/p] + [n/p^2] + [n/p^3] + .......
//3 求所有k(p)/ki中的最小值,其中ki为第一步质因数分解中质因子对应的系数,

#include<iostream>
using namespace std;
bool isPrime(int n)
{
        bool result = true;
        for (int i=2; i*i <= n; ++i)
        {
                if (n%i == 0)
                {
                        result = false;
                        break;
                }
        }
        return result;#include <cstdio>
#include <cmath>

int gdc(int a, int b) {
        int r = b;
        while (b != 0) {
                r = a % b;
                a = b;
                b = r;
        }
        return a;
}

int main() {
#ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
#endif
        int n,a;
        while (scanf("%d%d", &n, &a) != EOF) {
                int k = 0;
                int m = a;
                int pos = 2;
                int acc = pos;
                int t = 2; //m 和 pos的最大公约数
                while (pos <= n) {
                        t = gdc(m, acc);
                        if (t == m) {
                                ++k;
                                m = a;
                                acc /= t;
                        } else if (t == acc) {
                                m /= t;
                                acc = ++pos;
                        } else if(t == 1) { //互质
                                acc = ++pos;
                        } else {
                                m /= t;
                                acc = ++pos;
                        }
                }
                printf("%d\n", k);
        }

        return 0;
}
}
// get prime number m, s.t. n!/a^m ==0 , n!/a^(m+1) != 0
int getK(int n, int a)
{
        int result = 0;
        while ( n/a > 0)
        {
                result += n/a;
                n = n/a;
        }
        return result;
}
// get p st n^p=m
int getP(int m, int n)
{
        int result = 0;
        while ( m%n == 0)
        {
                ++result;
                m = m/n;
        }
        return result;
}
int main()
{
        int n, a;
        while (cin >> n >> a)
        {
                int out = 1000;
                int p1;
                int p2;
                for (int i=2; i <= a; ++i)
                {
                        if (isPrime(i) && a%i == 0)
                        {
                                p1 = getP(a, i);
                                p2 = getK(n, i);
                                out = p2/p1 < out ? p2/p1 : out;
                        }
                }
                cout << out << endl;
        }
        return 0;

}
//方法三:
include <cstdio>
#include <cmath>

int gdc(int a, int b) {
        int r = b;
        while (b != 0) {
                r = a % b;
                a = b;
                b = r;
        }
        return a;
}

int main() {
#ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
#endif
        int n,a;
        while (scanf("%d%d", &n, &a) != EOF) {
                int k = 0;
                int m = a;
                int pos = 2;
                int acc = pos;
                int t = 2; //m 和 pos的最大公约数
                while (pos <= n) {
                        t = gdc(m, acc);
                        if (t == m) {
                                ++k;
                                m = a;
                                acc /= t;
                        } else if (t == acc) {
                                m /= t;
                                acc = ++pos;
                        } else if(t == 1) { //互质
                                acc = ++pos;
                        } else {
                                m /= t;
                                acc = ++pos;
                        }
                }
                printf("%d\n", k);
        }

        return 0;
}

九度 1104 以及 辗转相除法的原理f昂发,布布扣,bubuko.com

时间: 2024-11-04 02:27:32

九度 1104 以及 辗转相除法的原理f昂发的相关文章

九度OJ--Q1165

九度OJ--Q1165 import java.util.ArrayList;import java.util.Scanner; /* * 题目描述: * 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串. * 匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如“aa[123]bb”,就是说aa1bb.aa2bb.aa3bb都算匹配. * 输入: * 输入有多组数据. * 每组数据第一行输入n(1<=n<=100

剑指OFFER之从上往下打印二叉树(九度OJ1523)

题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩

剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输入文件包含一组测试案例.对于每个测试案例,第一行输入一个n,代表该数组中数字的个数.接下来的一行输入n个整数.代表数组中的n个数. 输出: 对应每个测试案例,输入一行n个数字,代表调整后的数组.注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格. 样例输入: 5 1 2 3 4 5 样例输

九度 1203

#include <cstdio> #include <iostream> using namespace std; #ifdef ONLINE_JUDGE #define FINPUT(file) 0 #define FOUTPUT(file) 0 #else #define FINPUT(file) freopen(file,"r",stdin) #define FOUTPUT(file) freopen(file,"w",stdout)

九度 1205

#include <cstdio> #include <iostream> using namespace std; #ifdef ONLINE_JUDGE #define FINPUT(file) 0 #define FOUTPUT(file) 0 #else #define FINPUT(file) freopen(file,"r",stdin) #define FOUTPUT(file) freopen(file,"w",stdout)

九度 1351 只出现一次的数

#include <cstdio> #include <iostream> using namespace std; #ifdef ONLINE_JUDGE #define FINPUT(file) 0 #define FOUTPUT(file) 0 #else #define FINPUT(file) freopen(file,"r",stdin) #define FOUTPUT(file) freopen(file,"w",stdout)

九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题

题目1165:字符串匹配 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2497 解决:858 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如"aa[123]bb",就是说aa1bb.aa2bb.aa3bb都算匹配. 输入: 输入有多组数据. 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(

【剑指Offer面试题】九度OJ1384:二维数组中的查找

下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有优点的.加油~ 题目链接地址: http://ac.jobdu.com/problem.php?pid=1384 二维数组中的查找

九度oj 题目1007:奥运排序问题

九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万). 接下来一行给出M个国家号. 输出:                        排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名