蓝桥杯 历届试题 矩阵翻硬币(大数)
随后,小明对每一个硬币分别进行一次 Q 操作。
对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。
其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。
当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。
小明想知道最开始有多少枚硬币是反面朝上的。于是,他向他的好朋友小M寻求帮助。
聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。然而小明很懒,不愿意照做。于是小明希望你给出他更好的方法。帮他计算出答案。
对于20%的数据,n、m <= 10^7;
对于40%的数据,n、m <= 10^15;
对于100%的数据,n、m <= 10^1000(10的1000次方)。
【解题思路】
详细分析 这个是别人的分析,我就记录一下我的代码,要我分析反正我是分析不出来的╮(╯▽╰)╭
#include<iostream>
#include<string>
#include<cstring>
using namespace std;string mul(string str1,string str2) //大数相乘
{int len1 = str1.length();int len2 = str2.length();int num[1005];string res="";memset(num,0,sizeof(num));int i,j;for(i=len1-1;i>=0;i--){for(j=len2-1;j>=0;j--) //按位相乘str[i]*str[j] len1-1-i+len2-1-j控制末尾0的个数num[len1-1-i+len2-1-j] = num[len1-1-i+len2-1-j]+(str1[i]-'0')*(str2[j]-'0');}for(i=0;i<len1+len2;i++) //进位{if(num[i]>=10){num[i+1] = num[i+1]+num[i]/10;num[i] = num[i]%10;}}for(i=len1+len2-1;i>=0;i--) //将最前面的0减去if(num[i] != 0)break;for(;i>=0;i--)res += num[i]+'0';return res;
}int compare(string str1,string str2,int num) //大数比较
{int len1 = str1.length();int len2 = str2.length();
// cout<<"len1:"<<len1<<" "<<"len2:"<<len2<<" "<<"num:"<<num<<" "<<endl;
// cout<<"str1:"<<str1<<" "<<"str2:"<<str2<<" "<<endl;if(len1 > len2+num)return 1;else if(len1 < len2+num)return -1;else //len1 == len2+num{for(int i=0;i<len2;i++){if(str1[i] > str2[i]){return 1;}else if(str1[i] < str2[i]){return -1;}}}return 1;
}string root(string str) //大数开方
{int len = str.length();string res="";int num,i,j,flag;if(len%2==0)num = len/2-1;else num = len/2;for(i=0;i<num+1;i++){res += '0';for(j=1;j<10;j++){res[i] = j+'0';
// cout<<"res:"<<res;flag = compare(str,mul(res,res),2*(num-i));
// cout<<" "<<"flag:"<<flag<<endl;if(flag == -1) //res平方后比str大{j = j-1;res[i] = j+'0';break;}}}return res;
}int main()
{string str1,str2;cin>>str1>>str2;string res;str1 = root(str1);str2 = root(str2);res = mul(str1,str2);cout<<res<<endl;return 0;
}
蓝桥杯 历届试题 矩阵翻硬币(大数)相关推荐
- 蓝桥杯历届试题----矩阵翻硬币
矩阵翻硬币 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵.随后,小明对每一个硬币分别进行一次 Q 操作.对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进 ...
- Java实现 蓝桥杯 历届试题 矩阵翻硬币
问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所有第 ix 行,第 jy 列的硬币进行翻转. 其 ...
- 蓝桥杯历届试题:翻硬币——Java实现
题目: 以下是输入输出格式: 这里我也没多想,看到了输入的字符串不是固定的,但是我们需要对其进行元素的操作,马上就想到了Java中字符串和字符数组之间的转换--toCharArray()方法. 以下是 ...
- 历届试题 矩阵翻硬币 蓝桥杯 大数开方 大数相乘
历届试题 矩阵翻硬币 时间限制:1.0s 内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬 ...
- 【蓝桥杯】历届试题 矩阵翻硬币
历届试题 矩阵翻硬币 ----------------------------------------------------痞子小小崔 时间限制:1.0s 内存限制:256.0MB 问题描述 小明先 ...
- 历届试题 矩阵翻硬币
历届试题 矩阵翻硬币 时间限制:1.0s 内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行 ...
- 【蓝桥杯题解】矩阵翻硬币
历届试题 矩阵翻硬币 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的 ...
- 试题 历届试题 矩阵翻硬币
原题链接:试题 历届试题 翻硬币 1.懒得样式,截图如下 2.思路: 首先,同时翻动两个相邻的硬币,这就意味着不同的硬币的个数一定是偶数个,如果是奇数个永远也达不到目标状态. 其次,顺序翻转就是翻转次 ...
- 蓝桥 历届试题 矩阵翻硬币 JAVA
问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所有第 ix 行,第 jy 列的硬币进行翻转. 其 ...
最新文章
- Android的Adapter用法总结
- [转]你在修佛,还是在修魔
- nova hypervisor接口添加host_ip字段
- Python-可视化Evoked数据
- oracle对日期date类型操作的函数
- C++面试题:list和vector有什么区别
- 全注解怎么使用分页插件_分页插件使用的方式
- JAVA面试题(part7)--Integer类
- nginx负载均衡器处理session共享的几种方法(转)
- python基础之Day20part1
- 利用FbinstTool制作多系统(winPE+Ubuntu+CDLinux)启动U盘
- stm32 USB HID多点触摸屏上报安卓触摸信号
- [wirteup] unctf-web-can_you_hacked_me
- 银河麒麟禁止抓屏printScreen
- 全程无尿点,死磕前端~
- 不安装DBC2000安装架设传奇服务端的方法
- 一个关于LSTM生成歌词的练习
- 聊一聊DNS劫持那些事
- 利用CSV 引擎加载数据
- cad要素转ppt可编辑emf——城市规划(六)