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。
时间: 2024-10-06 21:02:48