zoukankan      html  css  js  c++  java
  • SGU[117] Counting

    Description

    描述

    Find amount of numbers for given sequence of integer numbers such that after raising them to the M-th power they will be divided by K.

    求出给定一个包含N个整数的序列,其中某个数字的M次方能被K整除的数的个数。

     

    Input

    输入

    Input consists of two lines. There are three integer numbers N, M, K (0<N, M, K<10001) on the first line. There are N positive integer numbers − given sequence (each number is not more than 10001) − on the second line.

    输入包含两行。第一行包含三个整数N, M, K (0 < N, M, K < 10001)。

    第二行包含N个正整数——给定的序列(每个数不超过10001)。


    Output

    输出

    Write answer for given task.

    输出给定任务的答案。


    Sample Input

    样例输入

    4 2 50

    9 10 11 12


    Sample Output

    样例输出

    1

     

    Analysis

    分析

    快速幂,时间复杂度为O(n logn),应该是可以过的。

    要注意用int的话会溢出,所以我直接用了unsigned long long。

    这道题目还有一个方法是质因数分解,求出M次方以后的各个因数个数(就是把个因子个数乘以M),然后和M的个因子的个数比较即可。

     

    Solution

    解决方案

    快速幂:

    #include <iostream>
    
    using namespace std;
    
    typedef unsigned long long  ull;
    
    ull Pow(ull x, ull y, ull z);
    
    int main()
    {
    	ull nTmp;
    	int N, M, K;
    	while(cin >> N >> M >> K)
    	{
    		int nCnt = 0;
    		for(int i = 1; i <= N; i++)
    		{
    			cin >> nTmp;
    			if(Pow(nTmp, M, K) == 0) { nCnt++; }
    		}
    		cout << nCnt << endl;
    	}
    	return 0;
    }
    
    ull Pow(ull x, ull y, ull z)
    {
    	if(y == 1) { return x % z; }
    	ull nTmp = Pow(x, y / 2, z);
    	if(y & 1) { return (ull)nTmp * nTmp * x % z; }
    	else { return (ull)nTmp * nTmp % z; }
    }
    

    质因数分解:

    #include <iostream>
    #include <memory.h>
    
    using namespace std;
    
    const int MAX = 10240;
    
    int X[MAX], Y[MAX];
    
    void Fact(int x, int *p);
    
    int main()
    {
    	int nTmp;
    	int N, M, K;
    	while(cin >> N >> M >> K)
    	{
    		int nCnt = 0;
    		memset(Y, 0, sizeof(Y));
    		Fact(K, Y);
    		for(int i = 1; i <= N; i++)
    		{
    			memset(X, 0, sizeof(X));
    			cin >> nTmp;
    			Fact(nTmp, X);
    			for(int i = 0; i < MAX; i++)
    			{ X[i] *= M; }
    			bool bFlag = true;
    			for(int j = 0; j < MAX; j++)
    			{
    				if(X[j] < Y[j]) { bFlag = false; break; }
    			}
    			if(bFlag) { nCnt++; }
    		}
    		cout << nCnt << endl;
    	}
    	return 0;
    }
    
    void Fact(int x, int *p)
    {
    	for(int i = 2; i <= x; i++)
    	{
    		if(x % i == 0)
    		{
    			while(x % i == 0)
    			{
    				(*(p + i))++;
    				x /= i;
    			}
    		}
    	}
    }
    

      

    这道题目使用快速幂需要将整除转换成mod以后余0。

  • 相关阅读:
    Log4net.config
    ASCII 转换帮助类
    维吉尼亚加密与解密
    nginx配置说明
    验证码
    css 设置下拉菜单
    输出一张自定义文字的图片
    mvc 自定义分页控件
    【模块化】export与export default在一个文件里共存,引入时需注意的地方
    【uniapp】兼容刘海屏底部安全区
  • 原文地址:https://www.cnblogs.com/Ivy-End/p/4298673.html
Copyright © 2011-2022 走看看