HDU 1316 大数二分

2024-06-20 04:48
文章标签 二分 大数 hdu 1316

本文主要是介绍HDU 1316 大数二分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

建素数表  二分查找  练手用了。。

#include "stdio.h"
#include "string.h"
int f[5010][1010];int pk(int a[],int b[])
{int i;if (a[0]>b[0]) return 1;if (a[0]<b[0]) return -1;for (i=a[0];i>=1;i--){if (a[i]>b[i]) return 1;if (a[i]<b[i]) return -1;}return 0;}int fi(int x[],int op)
{int l,r,mid,key;l=1;r=5000;while (l<=r){mid=(l+r)/2;key=pk(x,f[mid]);if (key==1) l=mid+1;else if (key==-1) r=mid-1;else return mid;}if (op==1) return l;if (op==2) return r;
}int main()
{int i,j,lea,leb,keya,keyb;int a[1201],b[1201];char stra[1201],strb[1201];memset(f,0,sizeof(f));f[1][0]=f[1][1]=f[2][0]=f[2][1]=1;for (i=3;i<=5000;i++){for (j=1;j<=f[i-1][0];j++)f[i][j]=f[i-1][j]+f[i-2][j];f[i][0]=f[i-1][0];for (j=1;j<=f[i][0];j++){f[i][j+1]+=f[i][j]/10;f[i][j]%=10;}if (f[i][f[i][0]+1]!=0) f[i][0]++;}//  printf("%d\n",f[5000][0]);while (scanf("%s",stra)!=EOF){scanf("%s",strb);if (stra[0]=='0' && strb[0]=='0') break;if (stra[0]=='0') stra[0]='1';a[0]=lea=strlen(stra);b[0]=leb=strlen(strb);for (i=0;stra[i];i++)a[lea-i]=stra[i]-'0';for (i=0;strb[i];i++)b[leb-i]=strb[i]-'0';keya=fi(a,1);keyb=fi(b,2);printf("%d\n",keyb-keya+1);}return 0;}


这篇关于HDU 1316 大数二分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077150

相关文章

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i

二分查找(算法篇)

算法之二分查找 二分查找 概念: 针对于已经预先排序好的数据,每次将数据进行对半查找,然后看它中间的数据是否是要找的,如果是就返回中间位置,不是就判断该数据是在前半部分还是后半部,然后在进而取其中部,看其是否找到,然后如果还没找到就一直重复操作,直到找到为止,该算法时间复杂度为O(logn) 代码: int search(vector<int>& nums, int target) {i

C语言实现简单二分搜索和四个变体问题

二分查找 简单的二分查找 简单指的是在不存在重复元素的数组中,查找值等于给定值的情况。 int bsearch(int *arr, int n, int value){int low = 0;int high = n - 1;int mid;while (low <= high){mid = low + ((high-low) >> 1);if (arr[mid] == value){re

HDU_1013

这个题目尤其需要注意的是开始输入的时候的数的大小,开始输入时有可能非常的大超过了长整型的范围,所以不能开始用整形来存放输入的,,就是开始的时候没有注意到这个问题所以开始的时候一直没有AC,后来就是用一个数组接收输入,然后在经过第一步转化之后就可以用一个整数来装了 #include <iostream>#include <stdlib.h>#include <string>usin

leetcode 二分查找·系统掌握 x的平方根

题目: 题解 这题可以使用~01~泛型查找在0~x/2的范围内查找答案。 int mySqrt(int x) {long l=0,r=x,mid;while(l<r){mid=(l+r+1)>>1;if(mid*mid>x)r=mid-1;else l=mid;}//因为一定有答案所以不用判定是否查找失败return l;}

[leetcode] 43. Multiply Strings(大数相乘)

Multiply Strings 描述 Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2. Note: 1. The length of both num1 and num2 is < 110. 2. Both num1 an

leetcode 二分查找·系统掌握 第一个错误版本

题意: 题解: 就是经典的~01~泛型查找,而且一定存在这样错误的版本所以查找不会"失败",返回每次查找结果即可。 int firstBadVersion(int n) {long l=1,r=n,mid;while(l<r){mid=(l+r)>>1;if(isBadVersion(mid))r=mid;else l=mid+1;}return l;}

leetcode 二分查找·系统掌握 搜索二维矩阵

题目: 题解: 一个可行的思路是使用~01~泛型对每一行的最后一个元素进行查找找到第一个大于等于target的那一行,判断查找结果如果“失败”返回false否则继续在改行进行常规二分查找target的值根据查找结果返回即可。 bool searchMatrix(vector<vector<int>>& matrix, int target) {int l=0,r=matrix.size()-

最长回文子串(百度笔试题和hdu 3068)

版权所有。所有权利保留。 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/17123559 求一个字符串的最长回文子串。注意子串是连续的,子序列是不连续的。对于最长回文子序列,要用动态规划解,具体请看: http://blog.csdn.net/xiaofei_it/article/details/1