链接:https://www.nowcoder.net/acm/contest/71/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小W在计算一个数列{An},其中A1=1,A2=2,An+2=An+1+An。尽管他计算非常精准,但很快他就弄混了自己的草稿纸,他找出了一些他计算的结果,但他忘记了这些都是数列中的第几项。
输入描述:
每行包括数列中的一项Ak(k<=100000)。
总行数T<=30。
输出描述:
对于每一项Ak,输出一行包括一个正整数k表示输入中数是数列的第几项。
示例1
输入
2 3 5 8 13
输出
2 3 4 5 6
并没有ac的答案:先用大数加法,求出每个数,在对输入的数用二分查找--->超时
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
string a[100005];
string sum(string s1,string s2){ //大数加法(string + string, return string)
if(s1.length()<s2.length())
{
string temp=s1;
s1=s2;
s2=temp;
}
int i,j;
for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
{
s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节
if(s1[i]-'0'>=10)
{
s1[i]=char((s1[i]-'0')%10+'0');
if(i) s1[i-1]++;
else s1='1'+s1;
}
}
return s1;
}
void db(){
a[1] = "1";
a[2] = "2";
for(int i = 3; i <= 10000; i++){
a[i] = sum(a[i - 1], a[i - 2]);
}
cout << a[200] << endl;
}
int bSearch(int begin, int end, string e) //二分查找string数组中的目标串
{
int mid, left = begin, right = end;
while(left <= right)
{
mid = (left + right) >> 1;
if(a[mid] == e)
return mid;
else if(a[mid].length() > e.length()) //根据string重载<>的的特点,我没要先按长度排序
right = mid - 1;
else if(a[mid].length() < e.length())
left = mid + 1;
else if(a[mid] > e)
right = mid - 1;
else if(a[mid] < e)
left = mid + 1;
}
return left;
}
int main(){
db();
string str;
while(cin >> str){
int x = bSearch(0, 30000, str);
printf("%d
", x);
}
return 0;
}
附上ac代码:居然可以取模来离散一下,还是题目做少了,赶紧刷题去:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
ll a[100005] = {0, 1, 2};
int main(){
string str;
for(int i = 3; i <= 100000; i++){
a[i] = (a[i - 1] + a[i - 2]) % mod;
}
while(cin >> str){
ll fn = 0;
for(int i = 0; i < str.length(); i++){
fn = (fn * 10 + str[i] - '0') % mod;
}
for(int i = 1; i <= 100000; i++){
if(fn == a[i]){
cout << i << endl;
break;
}
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define clr(a,b) memset(a,b,sizeof(a))
const ll mod=1000000007;
map<ll,int>m; //用了map,方便查询,可是好像没有直接暴力搜块
ll a[100001];
int main()
{
a[1]=1,a[2]=2;
m[1]=1,m[2]=2;
for (int i = 3; i < 100001; ++i)
{
a[i]=(a[i-1]%mod+a[i-2]%mod)%mod;
m[a[i]]=i;
}
string s;
while(cin>>s)
{
int l=s.length();
ll tp=0;
for (int i = 0; i < l; ++i)
{
tp*=10;
tp%=mod;
tp+=(s[i]&15);
tp%=mod;
}
cout<<m[tp]<<'
';
}
}