历届试题 矩阵翻硬币
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,你说奇不奇怪,就因为这个问题找了好久,导致数组没有被初始化完,然后后面的大数相乘得结果也是错的。。会不会因为数组在传参的时候只是把地址传过来了,并没有把内存大小传过来,,
以后已解决 百度一下 sizeof 百度百科就知道了。。
时间限制: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 百度百科就知道了。。
相关文章推荐
- java基础知识(二)
- the bundle at bundle path is not signed using an apple submission certificate
- Search in Rotated Sorted Array
- 诛仙手游 法宝属性道法性价比
- poj 3264 Balanced Lineup (线段树)
- 学习计划
- ARM第一部分-ARM的编程模式和7种工作模式
- [手游新项目历程]第3天-fatal error LNK1000: Internal error during IncrBuildImage
- nginx1.6.3源码安装,centos6系统下详解
- Hadoop1.X 与 Hadoop2.X比较
- 深入剖析动态代理--性能比较
- 诛仙手游-情缘高攻路线是低道法的最佳选择
- ARM第一部分-S5PV210启动过程详解2
- HTML基础篇--初识HTML
- Android 关于dp dip sp px dpi density解析
- Android 7.0 之 Java Lambda表达式入门
- JavaScript练习(一)
- 转:VC中WORD,DWORD,unsigned long,unsigned short的区别(转)
- Git使用之基于SSH的Gitserver的client配置(下篇)
- python3 字典属性