您的位置:首页 > 其它

历届试题 矩阵翻硬币

2016-03-12 11:44 162 查看
历届试题 矩阵翻硬币

时间限制:1.0s 内存限制:256.0MB

问题描述

  小明先把硬币摆成了一个 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次方)。

推规律+大数
http://blog.csdn.net/snailset/article/details/26752435这篇文章大家可以看看怎么推得,写的很好
下面附上只有90分的代码。。有一组数据超时了,其他的都是对的,,我也不想改了,毕竟搞了一天了,然后发现有些基础的东西都没搞懂,比如说memset,

对于传参过来的数组char a[],sizeof(a)为4 对于在函数体内部定义的数组char c[1101] sizeof(c)是1101,你说奇不奇怪,就因为这个问题找了好久,导致数组没有被初始化完,然后后面的大数相乘得结果也是错的。。会不会因为数组在传参的时候只是把地址传过来了,并没有把内存大小传过来,,

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

void muity(char aa[],char b[],char cc[])//大数相乘
{
int i,j,k;
int c[1101];

int lena=strlen(aa);
int lenb=strlen(b);

memset(c,0,sizeof(c));

//cout<<aa<<" "<<b<<endl;

for(i=lenb-1,k=0;i>=0;i--)
{
for(j=lena-1,k=lenb-i-1;j>=0;j--,k++)
{
c[k] +=(b[i]-'0')*(aa[j]-'0');
c[k+1] += (c[k]/10);
c[k]  %= 10;
}
}

if(c[k])
++k;

for(i=k-1,j=0;i>=0;i--)
{
cc[j++] = c[i] + '0';
}

cc[j] = '\0';

//cout<<cc<<endl;

}

void get_bit(char s[],int len,char aa[])
{
int i,j;
char c[1101];

//cout<<s<<" "<<len<<endl;

//cout<<sizeof(aa)<<endl<<sizeof(c)<<endl;为什么这里的两个数组的字节大小不同 。。。
memset(aa,'0',len*sizeof(char));
memset(c,'0',sizeof(c));

aa[len] = '\0';

//cout<<len<<endl;

for(i=0;i<len;i++)
{
for(j=9;j>=(i?0:1);j--)
{
aa[i] = j+'0';
//cout<<aa<<endl;
muity(aa,aa,c);
//cout<<c<<endl;

if(strlen(c) <= strlen(s))
{
if(strlen(c) == strlen(s) )
{
if(strcmp(c,s) > 0)
continue;
}
}
else
continue;

break;
}
}
//cout<<aa<<endl;
}

void get_sqrt(char n[],char m[],char res[])
{
int lenn,lenm;
char a[1101],b[1101];

lenn = strlen(n);
lenm = strlen(m);

//cout<<lenn<<" "<<lenm<<endl;

if(lenn%2)
lenn = lenn/2+1;
else
lenn = lenn/2;

if(lenm%2)
lenm = lenm/2+1;
else
lenm = lenm/2;

get_bit(n,lenn,a);
get_bit(m,lenm,b);
muity(a,b,res);
}

int main()
{
int i,j,k,l;
char n[1101],m[1101],res[1101];

while(~scanf("%s%s",n,m))
{
if(strlen(n) > strlen(m))
get_sqrt(n,m,res);
else
get_sqrt(m,n,res);

//		muity(n,m,res);
printf("%s\n",res);
}

return 0;
}


以后已解决 百度一下 sizeof 百度百科就知道了。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: