51nod 1024 矩阵中不重复的元素(质因数分解+map判重)
题目来源: Project Euler
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
![](https://file.51nod.com/images/icon/star.png)
![](https://file.51nod.com/images/icon/plus.png)
![](https://file.51nod.com/images/icon/wrong.png)
一个m*n的矩阵。
该矩阵的第一列是a^b,(a+1)^b,.....(a + n - 1)^b
第二列是a^(b+1),(a+1)^(b+1),.....(a + n - 1)^(b+1)
.......
第m列是a^(b + m - 1),(a+1)^(b + m - 1),.....(a + n - 1)^(b + m - 1)
(a^b表示a的b次方)
下面是一个4*4的矩阵:
2^2=4, 2^3=8, 2^4=16, 2^5=32
3^2=9, 3^3=27, 3^4=81, 3^5=243
4^2=16, 4^3=64, 4^4=256, 4^5=1024
5^2=25, 5^3=125, 5^4=625, 5^5=3125
问这个矩阵里有多少不重复的数(比如4^3 = 8^2,这样的话就有重复了)
2^2=4, 2^3=8, 2^4=16, 2^5=32
3^2=9, 3^3=27, 3^4=81, 3^5=243
4^2=16, 4^3=64, 4^4=256, 4^5=1024
m = 4, n = 3, a = 2, b = 2。其中2^4与4^2是重复的元素。
Input
输入数据包括4个数:m,n,a,b。中间用空格分隔。m,n为矩阵的长和宽(2 <= m,n <= 100)。a,b为矩阵的第1个元素,a^b(2 <= a , b <= 100)。
Output
输出不重复元素的数量。
Input示例
4 3 2 2
Output示例
11
分析:将a^b转化为质因数的幂的乘积的形式:(f[i]^h[i])*(f[i+1]^h[i+1])...
然后用string存储该形式,并用map容器统计该形式的数的数量。
1 #include <iostream> 2 #include <map> 3 #include <cmath> 4 #include <cstring> 5 using namespace std; 6 int m,n,a,b;//n行m列 7 string ans; 8 map<string,int> ma; 9 int sum; 10 int f[1005]; 11 int h[1005]; 12 void solve(int x,int y) 13 { 14 int tmp=sqrt(x+0.5); 15 int d=0; 16 memset(f,0,sizeof(f)); 17 memset(h,0,sizeof(h)); 18 for(int i=2;i<=tmp;i++) 19 { 20 if(x==1) 21 break; 22 if(x%i==0) 23 { 24 f[d++]=i; 25 while(x%i==0) 26 { 27 x/=i; 28 h[d-1]++; 29 } 30 } 31 } 32 if(x!=1) 33 f[d++]=x,h[d-1]++; 34 for(int i=0;i<d;i++) 35 h[i]*=y; 36 ans=""; 37 for(int i=0;i<d;i++) 38 { 39 while(f[i]) 40 { 41 char ch=f[i]%10-'0'; 42 ans=ans+(ch); 43 f[i]/=10; 44 } 45 ans=ans+'^'; 46 while(h[i]) 47 { 48 char ch=h[i]%10-'0'; 49 ans=ans+(ch); 50 h[i]/=10; 51 } 52 ans=ans+'*'; 53 } 54 if(ma[ans]) 55 sum--; 56 ma[ans]++; 57 } 58 int main() 59 { 60 ios::sync_with_stdio(false); 61 while(cin>>m>>n>>a>>b) 62 { 63 ma.clear(); 64 sum=m*n; 65 for(int i=a;i<=a+n-1;i++) 66 for(int j=b;j<=b+m-1;j++) 67 { 68 solve(i,j); 69 } 70 cout<<sum<<endl; 71 } 72 return 0; 73 }