hdu5750Dertouzos
来源:互联网 发布:sql笔试题及答案 编辑:程序博客网 时间:2024/06/05 17:58
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5750
题意:中文题意。
分析:用类似均摊的方法在遍历素数的时候加上n/d这个限制会优化。
代码:
#include<map>#include<set>#include<cmath>#include<queue>#include<bitset>#include<math.h>#include<vector>#include<string>#include<stdio.h>#include<cstring>#include<iostream>#include<algorithm>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;const int N=40010;const int mod=100000000;const int MOD1=1000000007;const int MOD2=1000000009;const double EPS=0.00000001;typedef long long ll;const ll MOD=1000000007;const int MAX=2000000010;const ll INF=1ll<<55;const double pi=acos(-1.0);typedef double db;typedef unsigned long long ull;int k,a[N],q[N],f[N];void deal(int n) { int i,j;k=0; for (i=2;i<=n;i++) { if (!q[i]) a[++k]=i; for (j=1;j<=k;j++) { if (a[j]*i>n) break ; q[a[j]*i]=1; if (i%a[j]==0) break ; } }}int main(){ int i,t,l,r,mid; ll n,d,g; scanf("%d", &t); deal(40000); while (t--) { scanf("%I64d%I64d", &n, &d); if (d>=n||d*2ll>=n) printf("0\n"); else { for (i=1;i<=3450&&a[i]<=n/d;i++) if (a[i]>d||d%a[i]==0) break ; if (a[i]>d) g=1ll*a[i-1]; else g=1ll*a[i]; l=1;r=k;mid=(l+r)>>1; while (l+1<r) if (1ll*a[mid]>g||1ll*a[mid]*d>=n) { r=mid;mid=(l+r)>>1; } else { l=mid;mid=(l+r)>>1; } printf("%d\n", l); } } return 0;}
0 0
- hdu5750Dertouzos
- HDU 1002 ????
- Android Fragment应用实战
- POJ 1182 食物链 *
- 使用IntelliJ IDEA开发SpringMVC网站(二)框架配置
- 蛇形填数
- hdu5750Dertouzos
- java基础之访问修饰符
- EasyUI_Datagrid编辑-键盘上下键选择行(一)
- 寻找最小的k个数
- LeetCode-19:Remove Nth Node From End of Lis
- hdu5749Colmerauer
- 47. Magneto Transaction Email(1)
- 乱头发节(badhair)
- 面向对象六大原则----单一职责原则