传送门

一开始在vjudge上看到这题时,标的来源是CSU 1120,第八届湖南省赛D题“平方根大搜索”。今天交题时CSU突然跪了,后来查了一下看哪家OJ还挂了这道题,竟然发现这题是出自UVA的,而且用的原题。


Description

time limit 5s

In binary, the square root of 2, denoted by sqrt(2), is an infinite number 1.0110101000001001111... Given an integer n and a binary string (i.e. a string consisting of 0 and 1) S, your task is to find the first occurrence of S in the fraction part (i.e. the part after the decimal point) of sqrt(n). In case sqrt(n) is an integer, the fraction part is an infinite sequence of zeros.

Input

The first line contains T (T ≤ 100), the number of test cases. Each of the following lines contains an integer n (2 ≤ n ≤ 1, 000, 000) and a binary string S with at most 20 characters.

Output

For each case, print the position of the first character in the first occurrence of S. The first digit after the dot is at position 0. The answer is guaranteed to be no greater than 100.

Sample Input

2

2 101

1202 110011

Sample Output

2

58

Solution

高精度

复杂度 $O(n^3)$

#include <bits/stdc++.h>
using namespace std;
const int N(), M();
int get_len(int n){
if(!n) return ;
int res=;
for(;n;res++,n>>=);
return res;
}
void trans(int n, int *bit, int &len){
int l=get_len(n);
for(int i=len+l-; i>=len; i--){
bit[i]=n&, n>>=;
}
len+=l;
}
int tmp[N], a[N], b[N], len, _len, LEN;
void sqr(){ //error-prone
memset(tmp, , sizeof(tmp));
for(int i=; i<len; i++) for(int j=; j<len; j++) tmp[i+j]+=a[i]*a[j];
for(int i=*len-; i; i--){
tmp[i-]+=tmp[i]/;
tmp[i]%=;
}
trans(tmp[], b, LEN=);
for(int i=; i<=*len-; i++) b[LEN++]=tmp[i];
}
int get_int(){
int res=, l=LEN-*_len;
for(int i=l-, _pow=; i>=; res+=b[i]*_pow, i--, _pow<<=); //error-prone
return res;
}
int solve(){
int n; string s, t; cin>>n>>t;
int m=sqrt(n);
if(m*m==n) return ;
len=_len=;
trans(m, a, len);
int tmp=len;
while(_len<M){
a[len++]=, _len++;
sqr();
if(get_int()>=n) a[len-]=;
}
for(int i=tmp; i<len; i++) s+='0'+a[i];
return s.find(t);
}
int main(){
//freopen("in", "r", stdin);
int T;
for(cin>>T; T--; cout<<solve()<<endl);
}

有意写得短一些,但还是有50行,太长了都不想看~

总结

总结一下高精度度乘法的写法,虽说也没什么可总结的。

无论二进制还是十进制,写法都一样,以下代码结合题目按二进制写。

1. 大整数的存法:int[]数组,左边高位(左高右低即书写格式,这样处理有一定优越性(真的有优越性吗?)),0-indexed

2. 将长为n的大整数的a[]和长为m的大整数的b[]相乘

先按如下方式将长为n+m-1中间结果存在数组tmp[]

memset(tmp, , sizeof(tmp));
for(int i=; i<n; i++)
for(int j=; j<m; j++)
tmp[i+j]+=a[i]*b[j];

再处理出最终结果存到数组c[]

for(int k=i+j-; k; k--)
tmp[k-]+=tmp[k]/, tmp[k]%=; int get_len(int n){
if(!n) return ;
int res=;
for(; n; res++, n>>=);
return res;
} len=get_len(tmp[]);
for(int i=len-; i>=; i--)
c[i]=tmp[]%, tmp[]/=; for(int k=; k<i+j-; k++)
c[len++]=tmp[k];

UVa 12505 Searching in sqrt(n)的更多相关文章

  1. 湖南省第八届大学生程序设计大赛原题 D - 平方根大搜索 UVA 12505 - Searching in sqrt(n)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30746#problem/D D - 平方根大搜索 UVA12505 - Searchin ...

  2. STL --- UVA 123 Searching Quickly

    UVA - 123 Searching Quickly Problem's Link:   http://acm.hust.edu.cn/vjudge/problem/viewProblem.acti ...

  3. uva 123 Searching Quickly

     Searching Quickly  Background Searching and sorting are part of the theory and practice of computer ...

  4. uva 1597 Searching the Web

    The word "search engine" may not be strange to you. Generally speaking, a search engine se ...

  5. Lucas定理初探

    1.1 问题引入 已知\(p\)是一质数,求\(\dbinom{n}{m}\pmod{p}\). 关于组合数,它和排列数都是组合数学中的重要概念.这里会张贴有关这两个数的部分内容. 由于Lucas定理 ...

  6. 基于STL的字典生成模块-模拟搜索引擎算法的尝试

    该课题来源于UVA中Searching the Web的题目:https://vjudge.net/problem/UVA-1597 按照题目的说法,我对按照特定格式输入的文章中的词语合成字典,以满足 ...

  7. Volume 1. Sorting/Searching(uva)

    340 - Master-Mind Hints /*读了老半天才把题读懂,读懂了题输出格式没注意,结果re了两次. 题意:先给一串数字S,然后每次给出对应相同数目的的一串数字Si,然后优先统计Si和S ...

  8. Searching the Web UVA - 1597

      The word "search engine" may not be strange to you. Generally speaking, a search engine ...

  9. 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 3(Sorting/Searching)

    第一题:340 - Master-Mind Hints UVA:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Item ...

随机推荐

  1. Volley(一 )—— 框架简介

    一.引言 虽然网上已经有很多大神.高手都写过了类似的帖子,但作为新人,必须要走模仿的道路,再考虑超越,因此学习大神的笔记,记录自己的理解,是一个菜鸟走向成功的必经之路啊.如签名所言,记录自己摸爬滚打的 ...

  2. Android优化—— 内存分析工具 MAT 的使用

    1 内存泄漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,其中有两项功能可用于内存检查 : ·    heap 查看堆的分配情况 ·     ...

  3. Lua笔记(1)

    今天开始学习Lua,下面把一些重点记下来: 单行注释-- ,多行注释 --[[  .......  --]] Lua中false和nil表示条件判断的假,其余的,包括空字符串,0,都表示真. Lua没 ...

  4. PHP安装memcache扩展接口步骤

    1.将php_memcache.dll文件保存到php的应用程序扩展ext目录中 2.在php.ini配置文件添加扩展的位置,加入一行extension=php_memcache.dll 3.重新启动 ...

  5. 多线程BackgroundWorker

    链接:http://www.cnblogs.com/yiyisawa/archive/2008/11/24/1339826.html 周六闲来无事,学习了多线程BackgroundWorker,以此记 ...

  6. SEO在网页制作中的应用

    1.什么是SEOSEO(Search Engine Optimization)中文意译为“搜索引擎优化”.SEO是指通过网站内部调整优化及站外优化,使网站满足搜索引擎收录排名需求,在搜索引擎中提高关键 ...

  7. 微软职位内部推荐-Software Development Engineering II

    微软近期Open的职位: Job Title: Software Development Engineering II Work Location: Suzhou, China Enterprise ...

  8. 《WCF服务编程第三版》知识点摘录

  9. vi 命令 用法

    一.Unix编辑器概述 编辑器是使用计算机的重要工具之一,在各种操作系统中,编辑器都是必不可少的部件.Unix及其相似的ix 操作系统系列中,为方便各种用户在各个不同的环境中使用,提供了一系列的ex编 ...

  10. [MetaHook] R_SparkStreaks

    By hzqst void R_SparkStreaks(vec_t *pos, int count, int velocityMin, int velocityMax) { int i; parti ...