【HDU5750 BestCoder Round 84D】【数学 贪心 复杂度计算】Dertouzos 范围有多少数的最大真约数为d

本文主要是介绍【HDU5750 BestCoder Round 84D】【数学 贪心 复杂度计算】Dertouzos 范围有多少数的最大真约数为d,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Dertouzos

Accepts: 76
Submissions: 1357
Time Limit: 7000/3500 MS (Java/Others)
Memory Limit: 131072/131072 K (Java/Others)
问题描述
正整数xx称为nn的positive proper divisor, 当且仅当x | nxn并且1 \le x < n1x<n. 例如, 1, 2, 和3是6的positive proper divisor, 但是6不是.Peter给你两个正整数nndd. 他想要知道有多少小于nn的整数, 满足他们的最大positive proper divisor恰好是dd.
输入描述
输入包含多组数据, 第一行包含一个整数TT (1 \le T \le 10^6)(1T106)表示测试数据组数. 对于每组数据:第一行包含两个整数nndd (2 \le n, d \le 10^9)(2n,d109).
输出描述
对于每组数据, 输出一个整数.
输入样例
9
10 2
10 3
10 4
10 5
10 6
10 7
10 8
10 9
100 13
输出样例
1
2
1
0
0
0
0
0
4
 


#include<stdio.h>
#include<algorithm>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }
const int N = 0, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;
int casenum, casei;
const int TOP = 4e5 + 10;
bool e[TOP];
int p[TOP];
int pnum;
int sum[TOP];
void prime()
{e[0] = e[1] = 1; pnum = 0;for (int i = 2; i<TOP; i++){sum[i] += sum[i - 1];if (e[i] == 0){p[++pnum] = i;++sum[i];}for (int j = 1; j <= pnum&&p[j] * i<TOP; j++){e[p[j] * i] = 1;if (i%p[j] == 0)break;}}
}
int n, d;
int main()
{prime();scanf("%d", &casenum);for (casei = 1; casei <= casenum; ++casei){scanf("%d%d", &n, &d);int top = min(d, (n - 1) / d);int topp = min(top, (int)sqrt(d));for (int i = 1; p[i] <= topp; ++i){if (d%p[i] == 0){gmin(top, p[i]);break;}}printf("%d\n", sum[top]);}return 0;
}
/*
【trick&&吐槽】
这道题自信满满地写完,结果最后FST (TLE)
本来可以红名的,结果跌了100分。
比赛的时候,一定要好好算复杂度啊。能压则压,这场比赛的C,D都死在了对复杂度的不严格要求上。衰= =#【题意】
我们称x为y的“最大真约数”,当且仅当x是y的约数,且x<y
现在给你两个正整数n个d,
问你,有多少个[1,n-1]范围的整数,满足——
该数的"最大真约数"恰好为d。【类型】
数学,贪心,复杂度计算。【分析】
首先,这些数必然是d的倍数,且是d的2~top倍。
且这个倍数,必须是素数,否则会产生比d更大的约数且这个倍数,最大只能为d,否则会使得最大因子不是d,
且这个倍数,不能超过(n-1)/d,因为数字范围有限制。
而min(d,(n-1)/d)是一个不超过3.2e4的数,我们预处理这里的素数个数即可。然而, 比赛的时候,这样交了一下,却收获一发WA,
我们进而发现,还应当有条件被满足——
因为d是这个数的最大约数。
所以,d的最大约数*该素数<=d一定要满足。
也就是说,该素数<=d的最小非1约数于是,该素数的范围是[ min(min(d,(n-1)/d), d的最小素因子)]
于是对于给定的d,我们去找其最小非1约数(显然该约数是个素数)。【时间复杂度&&优化】
O(T sqrt(d))
=>
O(T min(min(d,(n-1)/d), sqrt(d)))由单组最大3e4,缩小为1e3,就可以AC了*/


这篇关于【HDU5750 BestCoder Round 84D】【数学 贪心 复杂度计算】Dertouzos 范围有多少数的最大真约数为d的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa