传送门

一开始在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. 【从0到1】android网络框架的选型参考

    项目会使用到 socket tcp 级的网络访问,想选取一个使用较成熟异步网络框架, 提到的网络框架: 1. volley, 2. xutils. 3. android 4. netty, 5. mi ...

  2. c#解决窗体假死的一种方法

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_C ...

  3. 使用CSS3画出一个叮当猫

    刚学习了这个案例,然后觉得比较好玩,就练习了一下.然后发现其实也不难,如果你经常使用PS或者Flash的话,应该就会知道画个叮当猫是很容易的事,至少我是这么觉得.但是,用CSS3画出来确实是第一次接触 ...

  4. 013医疗项目-模块一:加入工具类ResultUtil

    这篇文章要做的就是优化,封装.把之前的代码尽量封装进类,并且不要硬编码. 在UserServiceimpl中的insertSysuser()函数之前是这么写的: ResultInfo resultIn ...

  5. SQL2008安装后激活方式以及提示评估期已过解决方法(转)

    第一步:进入SQL2008配置工具中的安装中心第二步:再进入维护界面,选择版本升级第三步:进入产品密钥,输入密钥第四步:一直点下一步,直到升级完毕.SQL Server 2008 Developer: ...

  6. android volley get请求使用

    调用百度api微博热门精选接口,使用了volley,简单说说volley get的请求方式的使用 header的设置和请求参数的设置,见代码如下: private void getWeixinNews ...

  7. C语言 百炼成钢14

    //题目40:输入3个数a,b,c,按大小顺序输出.(使用指针完成) #include<stdio.h> #include<stdlib.h> //分析:用指针完成,说明不可以 ...

  8. C#泛型-模板特化

    class TClass<T, K> { } class SubTClass<T, C, K> : TClass<Char, K> { } class SubTCl ...

  9. FTP登录/目录破解

    l临时简单的验证,还需要优化... 登录: import ftplib usr = open('usr.txt','r') ftp = ftplib.FTP("*************&q ...

  10. C# 版本的 计时器类:精确到微秒 秒后保留一位小数 支持年月日时分秒带单位的输出

    class TimeCount { // 临时变量,存放当前类能表示的最大年份值 ; /// <summary> /// 获取毫秒能表示的最大年份数 /// </summary> ...