标题:矩阵翻硬币
小明先把硬币摆成了一个 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;
}
//弱死了。。。。