标签:bbb problem include stream ace sqrt 质因数分解 表示 重复
输入数据包括4个数:m,n,a,b。中间用空格分隔。m,n为矩阵的长和宽(2 <= m,n <= 100)。a,b为矩阵的第1个元素,a^b(2 <= a , b <= 100)。
输出不重复元素的数量。
4 3 2 2
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 }
51nod 1024 矩阵中不重复的元素(质因数分解+map判重)
标签:bbb problem include stream ace sqrt 质因数分解 表示 重复
原文地址:http://www.cnblogs.com/onlyli/p/7298269.html