历届试题 矩阵翻硬币

来源:互联网 发布:网络销售股票怎么赚钱 编辑:程序博客网 时间:2024/05/16 08:40
 历届试题 矩阵翻硬币  
时间限制: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;}}elsecontinue;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;elselenn = lenn/2;if(lenm%2)lenm = lenm/2+1;elselenm = 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  百度百科就知道了。。






0 0
原创粉丝点击