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. 递归输入与引用传值(UVa839 Not so Mobile)

    题目的大意是一个树形天平,输入给出样例的个数,然后空一行,每行4个数W1,D1,W2,D2,分别代表天平左侧的重量.力臂和天平右侧的重量.力臂.如果W1或者W2为0,则代表该节点有左子树或右子树,如果 ...

  2. 34、Django实战第34天:退出登录

    编辑users.view.spy ... from django.contrib.auth import authenticate, login, logout from django.http im ...

  3. 解决intellij idea中使用live edit插件不能在chrome即时显示css变化的方法(html可以)

    问题源于一次chrome内核的更新 详细请看 http://src.chromium.org/viewvc/blink/trunk/Source/devtools/protocol.json?revi ...

  4. luogu P1056 排座椅

    题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳.同学 ...

  5. [CodeChef-DGTCNT]Chef and Digits

    题目大意: 若一个十进制数$x$(不含前导零)满足数码$i$恰好出现$t_i$次,则这个数是坏的,否则是好的.求区间$[L,R](1\le L,R\le10^{18})$中有多少好数. 思路: 显然可 ...

  6. [CF911B]Two Cakes

    题目大意: 有两种蛋糕,分别被切成了a块和b块,要把这些蛋糕分到n个盘子里. 要求每个盘子里只能有一种蛋糕,每一种蛋糕都被分.问最优情况下,盘子里至少能放几个蛋糕. 思路: 二分答案. 由于每个蛋糕都 ...

  7. Spring Boot中使用MyBatis注解配置详解

    传参方式 下面通过几种不同传参方式来实现前文中实现的插入操作. 使用@Param 在之前的整合示例中我们已经使用了这种最简单的传参方式,如下: @Insert("INSERT INTO US ...

  8. 1.3(学习笔记)Servlet获取表单数据

    一.Servlet获取表单数据 表单提交数据经由Servlet处理,返回一个处理结果显示在页面上, 那么如何获取表单提交的参数进出相应的处理呢? 主要用到以下方法: String  getParame ...

  9. Jquery radio选中

    radio选中$("input[name=test][value=34]").attr("checked",true);//value=34的radio被选中$ ...

  10. Using Dtrace OEL 6.X and Oracle® Solaris 11.3 DTrace (Dynamic Tracing) Guide

    http://www.hhutzler.de/blog/using-dtrace/ https://docs.oracle.com/cd/E53394_01/html/E53395/gkyaz.htm ...