14蓝桥杯 矩阵翻硬币

标题:矩阵翻硬币

小明先把硬币摆成了一个 n 行 m 列的矩阵。

随后,小明对每一个硬币分别进行一次 Q 操作。

对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。

其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。

当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。

小明想知道最开始有多少枚硬币是反面朝上的。于是,他向他的好朋友小M寻求帮助。

聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。然而小明很懒,不愿意照做。于是小明希望你给出他更好的方法。帮他计算出答案。

【数据格式】
输入数据包含一行,两个正整数 n m,含义见题目描述。
输出一个正整数,表示最开始有多少枚硬币是反面朝上的。

【样例输入】
2 3

【样例输出】
1

【数据规模】
对于10%的数据,n、m <= 10^3;
对于20%的数据,n、m <= 10^7;
对于40%的数据,n、m <= 10^15;
对于10%的数据,n、m <= 10^1000(10的1000次方)。

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。
(没读懂题,找规律一直是弱鸡。。)
参考博客:
https://blog.csdn.net/snailset/article/details/26752435

代码(debug半天放弃了,sqrtStr函数实在不知道哪儿没写对。)

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
#include <queue>
#define LL long long
using namespace std;
string strmul(string s1,string s2)
{
	int i,j;
//	cout<<s1<<endl;
//	cout<<s2<<endl;
//	cout<<endl;
	int num[1000]={0};
	int len1=s1.length();
	int len2=s2.length();
	string res="";
	for(i=0;i<len1;i++)
	  for(j=0;j<len2;j++)
	    num[len1-1-i+len2-1-j]+=(s1[i]-'0')*(s2[j]-'0');
    for(i=0;i<len1+len2;i++)
    {
    	num[i+1]+=num[i]/10;
    	num[i]=num[i]%10;
	}
	for(i=len1+len2-1;i>=0;i--)
	  if(num[i]!=0) break;
	for(j=i;j>=0;j--)
	  res+=(num[j]+'0');
	return res;
}
//在s1后添num0个0,与s2作比较 
int cmpstr(string s1,string s2,int num0)
{
   int len1=s1.length();
   int len2=s2.length();
   if(len2>len1+num0)  return 0;
   if(len2<len1+num0)  return 1;
   for(int i=0;i<len2;i++)
   {
   	  if(s1[i]-'0'>s2[i]-'0') return 1;
   	  if(s1[i]-'0'<s2[i]-'0') return 0;
   }  	
   return 0;		
}

string sqrtStr(string str)
{
    int len = str.length();
    int i = 0; 
    int j = 0;
    string strResult = "";
    string str1 = "";
    if(0 == len % 2)
    {         //为偶数位
        for(i = 0; i < len/2; i++)
        {
            for(j = 0; j < 10; j++)
            {
            	
                str1 = strResult;
                str1 += j + '0';
                if(1 == cmpstr(strmul(str1, str1) , str , 2*(len/2-i-1)) )
                {         //由于str1后少了len/2-i-1个0,所以平方以后少了2*(len/2-i-1)个
                    strResult +=  j-1 + '0';
                    break;
                }
                if(9 == j) strResult += '9';
            }
        }
    }
    else
    {       //为奇数位
        for(i = 0; i < len/2+1; i++)
        {
            for(j = 0; j < 10; j++)
            {
                str1 = strResult;
                str1 += j + '0';
                if(1 == cmpstr(strmul(str1, str1) , str , 2*(len/2-i)) )
                {
                    strResult +=  j-1 + '0';
                    break;
                }
                if(9 == j) strResult += '9';
            }
        }
    }
    return strResult;
}


//string sqrtStr(string s)
//{
//   int len=s.length();
//   string res="";
//   string ss="";
//   if(len%2==0)
//   {
//   	  for(int i=0;i<len/2;i++)
//   	  {
//   	    for(int j=0;j<10;j++)
//		{
//		   ss=res;
//		   ss+=j+'0';
//		   if(1==cmpstr(strmul(ss,ss),s,2*(len/2-i-1))); 		
//		   {
//		     res+=j-1+'0';	
//		   	 break;
//		   }		
//		   if(j==9) res+='9';
//		}		
//	  }
//   }
//   else
//   {
//   	  for(int i=0;i<len/2+1;i++)
//   	  {
//   	    for(int j=0;j<10;j++)
//		{
//		   ss=res;
//		   ss+=j+'0';
//		   if(1==cmpstr(strmul(ss,ss),s,2*(len/2-i))); 		
//		   {
//		     res+=j-1+'0';	
//		   	 break;
//		   }		
//		   if(j==9) res+='9';
//		}		
//	  }   	  
//   }
//   return res;	
//	
//} 
int main()
{
   string s1,s2;
   cin>>s1>>s2;
   cout<<strmul(sqrtStr(s1),sqrtStr(s2))<<endl;
   return 0;
}

//弱死了。。。。

猜你喜欢

转载自blog.csdn.net/birdmanqin/article/details/86823796