蓝桥杯T126(xjb&大数开方)
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T126
题意:中文题诶~
思路:显然被翻转了奇数次的硬币为反面朝上,但是本题的数据量很大,所以O(n^2)枚举每个点肯定是不行的...
可以反过来想一下,对于一个坐标 (i, j),显然其只被坐标 (x, y) 影响当且仅当 x 是 i 的因子或者 y 是 j 的因子;
用 f(x) 表示 x 的因子数目,那么坐标 (i, j) 反面朝上的充要条件为 f(i)*f(j) 为奇数,即 f(i) 为奇数并且 f(j) 为奇数;
显然当且仅当 i 为完全平方数的时候 f(i) 为奇数;那么对于 n*m 的矩阵,反面朝上的硬币数目为:
小于等于n的完全平方数的数目 * 小于等于m的完全平方数的数目,即 sqrt(n)*sqrt(m);
注意:这里的n, m范围为1e1000,需要写个大数开方;
代码:
#include<iostream>
#include<string>
#include<string.h>
using namespace std; const int MAXN = 1e3+;
string s1, s2; //n,m;
int len1, len2; //记录开根号后大数的位数; int sqrta[MAXN], sqrtb[MAXN];
int a[MAXN], temp[MAXN], ans[MAXN]; int compare(int a[], int b[], int len1, int len2){
if(len1 > len2) return ;
else if(len1 < len2) return -;
for(int i=len1-; i>=; i--){
if(a[i] > b[i]) return ;
else if(a[i] < b[i]) return -;
}
return ;
} //计算A[]*B[],返回答案长度
int multi(int *ans, int A[], int B[], int len1, int len2){
for(int i=; i<=; i++) ans[i]=;//传址数组不能用memset初始化
for(int i=; i<len1; i++){
for(int j=; j<len2; j++){
ans[i+j] += A[i]*B[j];
}
}
for(int i=; i<len1+len2; i++){
ans[i+] += ans[i]/;
ans[i] %= ;
}
int i;
for(i=len1+len2; i>=; i--){
if(ans[i]) break;
}
return i+;
} //对s开方,结果倒序存储于A数组,返回答案长度
int get_sqrt(int *A, string s){
memset(A, , sizeof(A));
memset(a, , sizeof(a));
int len1 = s.size();
int len2 = len1>>;
if(len1 & ) len2 += ;
for(int i=,j=s.size()-; i<s.size(); i++,j--){//翻转
a[j]=s[i]-'';
}
for(int i=len2-; i>=; i--){//从最高位开始
int flag;
int lenMul=;
memset(temp, , sizeof(temp));
while((flag=compare(temp, a, lenMul, len1))==-){
A[i]++;
lenMul=multi(temp, A, A, len2, len2);
}
if(flag==) break;
else if(flag==) A[i]--;
}
return len2;
} int main(void){
memset(sqrta, , sizeof(sqrta));
memset(sqrtb, , sizeof(sqrtb));
cin >> s1 >> s2;
len1 = get_sqrt(sqrta, s1);
len2 = get_sqrt(sqrtb, s2);
int len = multi(ans, sqrta, sqrtb, len1, len2);
for(int i=len-; i>=; i--){
cout << ans[i];
}
cout << endl;
return ;
}
蓝桥杯T126(xjb&大数开方)的更多相关文章
- Java中利用BigInteger类进行大数开方
在Java中有时会用到大数据,基本数据类型的存储范围已经不能满足要求了,如要对10的1000次方的这样一个数据规模的数进行开方运算,很明显不能直接用Math.sqrt()来进行计算,因为已经溢出了. ...
- 2012年 蓝桥杯预赛 java 本科 题目
2012年 蓝桥杯预赛 java 本科 考生须知: l 考试时间为4小时. l 参赛选手切勿修改机器自动生成的[考生文件夹]的名称或删除任何自动生成的文件或目录,否则会干扰考试系统正确采集您的解答 ...
- 蓝桥杯---数独(模拟 || dfs)
[编程题](满分33分) "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数 学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6 ...
- 第四届蓝桥杯 c/c++真题
第四届蓝桥杯 c/c++真题 <1>高斯日记 问题 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们 ...
- 第三届蓝桥杯 c/c++真题
第三届蓝桥杯真题 c/c++ 以下题目我自己也并不是所有的题目都是一次性就能做对或是有结题思路的.有些题目也是经过查证网上相关的资料或是参考了别人的代码和解题思路才做出来的.总的来看,这份题目考了很多 ...
- 黄金连分数|2013年蓝桥杯B组题解析第四题-fishers
黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜,它首次 ...
- 算法笔记_199:第二届蓝桥杯软件类决赛真题(C语言本科)
前言:以下代码部分仅供参考,C语言解答部分全部来自网友,Java语言部分部分参考自网友,对于答案的正确性不能完全保证. 试题1 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. ...
- 乘积最大|2018年蓝桥杯B组题解析第十题-fishers
标题:乘积最大 给定N个整数A1, A2, ... AN.请你从中选出K个数,使其乘积最大. 请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数. 注意,如果X ...
- 2019年第十届蓝桥杯省赛总结(JavaA组)
//update3.28:省一rank4,莫名进了国赛好神奇.. 记yzm10第一次体验A组(纯粹瞎水). 早闻山东的JavaA组神仙打架,进国赛都成了奢望(往年只有五个名额),因此抱着做分母的心态来 ...
随机推荐
- Golang JSON操作汇总
直接把结构体编码成json数据 package main import ( "encoding/json" "fmt" _ "os" ) t ...
- css 改变图片灰度颜色
我一直喜欢灰度图像因为我认为他们看起来更有艺术感.很多图片编辑如Photoshop很容易把你的彩色图像变成灰度.甚至有选择调整颜色深度和色调.不幸的是,这样的效果想做在网络上并不容易,因为浏览器有差异 ...
- SD相关的表
[转] 一.客户主数据基本数据放在KNA1里:公司代码放在KNB1里:销售视图放在KNVV里:合作伙伴放在KNVP里:二.信用主数据KNKK里有信贷限额.应收总额.特别往来:S066里是未清订单值:S ...
- php 生成bing词典能导入的xml(有道词典->bing词典)
编程以来一直用网易有道词典查单词.翻译:最近一直在看英文方面的资料,于是越来越对有道词典(划词.广告,本来想转灵格斯的,但灵格斯没有android版)不满意,一番试用后决定转bing词典,于是想把有道 ...
- MySQL——并发控制(锁)
核心知识点: 1.表锁和行级锁代表着锁的级别:读锁和写锁代表锁定真实类型. 2.读锁属于共享锁,共享同一资源,互不干扰:写锁属于排他锁,为了安全起见,写锁会阻塞其他的读锁和写锁. 3.表锁的开销最小, ...
- Java for LeetCode 136 Single Number
Given an array of integers, every element appears twice except for one. Find that single one. Note: ...
- mac下编译FFmpeg-Android
参考: [史上最傻瓜的]mac下编译FFmpeg-Android http://blog.csdn.net/ashqal/article/details/9381037
- BZOJ 4435 [Cerc2015]Juice Junctions 分治最小割+hash
分治最小割的题目,要求n2. 之前用的n3的方法自然不能用了. 于是用hash,设hash[i][j]表示在最小割为i的时候,j是否与S联通. 看懂这个需要理解一下最小割树的构造. 这种题建议用EK写 ...
- BZOJ 3671 NOI2014 随机数生成器
这题其实是个暴力. 首先那一堆如何构造n*m方格的东西都是在玩你. 构造出来方阵后,由于是一个排列,不存在重复,可以大力贪心. 每次将选出一个最小的元素,然后将它右上左下的元素全部打上标记(记得bre ...
- java语言中Object对象的hashCode()取值的底层算法是怎样实现的
Java语言中,Object对象有个特殊的方法:hashcode(), hashcode()表示的是JVM虚拟机为这个Object对象分配的一个int类型的数值,JVM会使用对象的hashcode值来 ...