http://acm.hdu.edu.cn/showproblem.php?pid=3641

学到:

1、二分求符合条件的最小值

/*====================================================
二分查找符合条件的最小值
======================================================*/
ll solve()
{
__int64 low = 0, high = INF, mid ;
while(low <= high){
mid = (low + high) >> 1;
// printf("%d&&\n",mid);
if(C(mid)) high = mid - 1;
else low = mid + 1;
}
return low;
}

2、求x!中prime[i]的个数

            for(ll k=prm[i];k<=x;k*=prm[i])
{
sum+=x/k; ///
if(sum>=num[prm[i]])break;
}

牛逼的代码。解释例如以下:

比方x=16,prm[i]=2。一般的思路是2,4,6,8,10,12,14,16  算出这几个数的因子2的个数和,由于4,8,16等不止包括一个因子,所以不是一重循环就能够搞的

这个代码在O(logn)搞了 方法是  k*=prm[i]  比方包括2的平方这个因子的数是4,8,16,那么第一次k=2的时候已经加过一次1,当k*=2  即k==4的时候。又加了一个1,也就相当于考虑上2的二次,  不错的代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const ll INF = ll_INF/2;//99999999999999999999;///ll_INF;// const int MAXN =110;
const int N = 110;
const int M = N;
int prmcnt;
bool is[N]; int prm[M];
int getprm(int n){
int i, j, k = 0;
int s, e = (int)(sqrt(0.0 + n) + 1);
memset(is, 1, sizeof(is));
prm[k++] = 2; is[0] = is[1] = 0;
for(i = 4; i < n; i += 2) is[i] = 0;
for(i = 3; i < e; i += 2) if(is[i]) {
prm[k++] = i;
for(s = i * 2, j = i * i; j < n; j += s)
is[j] = 0;
// 由于j是奇数,所以+奇数i后是偶数,不必处理! }
for( ; i < n; i += 2) if(is[i]) prm[k++] = i;
return k; // 返回素数的个数
} ll a[MAXN],b[MAXN];
ll num[MAXN]; ll getnum(ll t, ll pm)
{
ll ret=0;
while(t%pm == 0)
{
ret++;
t/=pm;
}
return ret;
} bool C(ll x)
{
ll sum=0;
for(int i=0;i<prmcnt;i++)
if(num[prm[i]])///
{
sum=0;
for(ll k=prm[i];k<=x;k*=prm[i])
{
sum+=x/k; ///
if(sum>=num[prm[i]])break;
}
if(sum<num[prm[i]])return 0;
}
return 1;
} /*ll solve()
{
ll d=0,up=INF,mid;
while(up>d+1)
{
mid=(d+up)/2;
if(C(mid))up=mid;
else d=mid;
}
return up;
}*/
ll solve()
{
__int64 low = 0, high = INF, mid ;
while(low <= high){
mid = (low + high) >> 1;
// printf("%d&&\n",mid);
if(C(mid)) high = mid - 1;
else low = mid + 1;
}
return low;
} int main()
{
//IN("hdu3641.txt");
prmcnt=getprm(105);
int ncase;
int n;
scanf("%d",&ncase);
while(ncase--)
{
CL(num,0);
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%I64d%I64d",&a[i],&b[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<prmcnt;j++)
{
if(a[i]%prm[j] == 0)
{
num[prm[j]]+=getnum(a[i],prm[j])*b[i];
}
}
}
printf("%I64d\n",solve());
}
return 0;
}

hdu 3641 数论 二分求符合条件的最小值数学杂题的更多相关文章

  1. HDU 4651 数论 partition 求自然数的拆分数

    别人的解题报告: http://blog.csdn.net/zstu_zlj/article/details/9796087 我的代码: #include <cstdio> #define ...

  2. hdu 4432 数学杂题

    http://acm.hdu.edu.cn/showproblem.php?pid=4432 6分钟写的代码,一上午去调试,, 哎,一则题目没看懂就去写了,二则,哎,,恶心了.在坚持几天然后ACM退役 ...

  3. codeforce 1070 E Getting Deals Done(二分求最大化最小值)

    Polycarp has a lot of work to do. Recently he has learned a new time management rule: "if a tas ...

  4. HDU 2035 人见人爱A^B(二分求幂,快速求幂)

    题意:求A的B次方的后三位数字 思路1:常规求幂,直接取余求解 代码: #include<iostream> #include<cstdio> using namespace ...

  5. Codeforces 955C - Sad powers(数论 + 二分)

    链接: http://codeforces.com/problemset/problem/955/C 题意: Q次询问(1≤Q≤1e5),每次询问给出两个整数L, R(1≤L≤R≤1e18),求所有符 ...

  6. hdu 3681(bfs+二分+状压dp判断)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 思路:机器人从出发点出发要求走过所有的Y,因为点很少,所以就能想到经典的TSP问题.首先bfs预 ...

  7. OpenJudge计算概论-求满足条件的3位数

    /*======================================================================== 求满足条件的3位数 总时间限制: 1000ms 内 ...

  8. 寻找符合条件的最短子字符串——SLIDING WINDOW

    简介 用一个可伸缩的窗口遍历字符串,时间复杂度大致为O(n).适用于“寻找符合某条件的最小子字符串”题型. 题目 链接 求某字符串T中含有某字符串S的所有字符的最小子字符串.如果不存在则返回" ...

  9. GCD and LCM HDU 4497 数论

    GCD and LCM HDU 4497 数论 题意 给你三个数x,y,z的最大公约数G和最小公倍数L,问你三个数字一共有几种可能.注意123和321算两种情况. 解题思路 L代表LCM,G代表GCD ...

随机推荐

  1. RabbitMQ生产部署指南

    像RabbitMQ这样的数据服务通常有许多可调参数.一些配置对开发有很大的意义,但并不适合生产,本指南旨在为此提供帮助 虚拟主机 例如,在单租户环境中,当您的RabbitMQ集群专门为生产中的单个系统 ...

  2. 杭电oj 1000

    今天开始和一个认识的学弟刷题. 学弟是个大牛,我还是个菜鸟.嘿嘿. 杭电第一题我就wrong了好几次. #include <iostream> using namespace std; i ...

  3. [Codeforces 17C] Balance

    Brief Introduction: 给定一个仅由abc组成的字符串,每个字符可以向左右延展,求最终新的平衡字符串的个数. Algorithm: 关键点在于变换前后字符串中字符的相对位置不会发生改变 ...

  4. 【权值分块】bzoj1861 [Zjoi2006]Book 书架

    权值分块……rank3……没什么好说的. #include<cstdio> #include<cmath> #include<algorithm> using na ...

  5. 【基数排序】bzoj1901 Zju2112 Dynamic Rankings

    论NOIP级别的n²算法…… 跟分块比起来,理论上十万的数据只慢4.5倍左右的样子…… #include<cstdio> #include<algorithm> using n ...

  6. 摄氏度和华氏度之间的额转换 Exercise06_08

    /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:摄氏度和华氏度之间的额转换 * */ public class Exercise06_08 { public static v ...

  7. iOS9 HTTPS解决办法

    iOS9引入了新特性App Transport Security (ATS).详情:App Transport Security (ATS) 新特性要求App内访问的网络必须使用HTTPS协议.但是现 ...

  8. OC语言基础之类的本质

    一.类的本质 1: // 类本身也是一个对象,是个Class类型的对象,简称类对象 2: 3: /* 4: 利用Class 创建 Person类对象 5: 6: 利用 Person类对象 创建 Per ...

  9. Android2017最新面试题(3-5年经验个人面试经历)

    2017最新Android面试题 大家好,在跟大家讲述自己的面试经历,以及遇到的面试题前,先说说几句题外话. 接触Android已经3年,在工作中遇到疑难问题总是在网上(csdn大牛博客,stacko ...

  10. 单元测试 2 & 初识模块3

    单元测试 - 创建测试用例 单元测试是什么? (老鸟可以无视下面这段话.) hi,新同学们,咱们的PHP代码里满布着好多函数和类,经常互相调用,你改的一个函数/方法可能是"比较底层" ...