题意:求所有自己的最小公倍数的和。 该集合是  2^ai  * 3^bi

思路:线段树。 线段树中存的是  【3^b * f(b)】   f(b)表示 因子3 的最小公倍数3的部分  为 3^b的个数  那么从小到大枚举a  对于当前的  ab  ,  如果之前的b小于当前的b  那么最小公倍数就为  (2^a) *  (3^b)   个数 就为 2^x     x表示a  b 都小于当前a b的个数 。  大于的部分 就直接是  2^a   * 线段树上【b,max】的和。   求好当前更新进去,对于 【b,max】 区间 直接乘2 (表示当前这个b可选可不选) 。       b位置加上(2^x)  * (3^b) 的值即可(当前b被选为最大的b时的个数)。

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include <iostream>
#define lson i<<1
#define rson i<<1|1
#define LL long long
#define N 100050
#define MOD 1000000007
using namespace std;
int cnt[N*],val[N*],sum[N*],mul[N*];
int mypow(int a,int b)
{
int res=;
while(b)
{
if(b&)
res=(LL)res*a%MOD;
a=(LL)a*a%MOD;
b>>=;
}
return res;
}
int qa[N],qb[N];
void build(int l,int r,int i)
{
cnt[i]=sum[i]=;
mul[i]=;
if(l==r)
{
val[i]=mypow(,qb[l]);
return ;
}
int mid=(l+r)>>;
build(l,mid,lson);
build(mid+,r,rson);
}
void pushdown(int i)
{
if(mul[i]!=)
{
mul[lson]=(LL)mul[lson]*mul[i]%MOD;
mul[rson]=(LL)mul[rson]*mul[i]%MOD;
sum[lson]=(LL)sum[lson]*mul[i]%MOD;
sum[rson]=(LL)sum[rson]*mul[i]%MOD;
mul[i]=;
}
}
void pushup(int i)
{
cnt[i]=cnt[lson]+cnt[rson];
sum[i]=(sum[lson]+sum[rson])%MOD;
}
void update(int l,int r,int pl,int pr,int type,int va,int i)
{
if(l>=pl&&r<=pr)
{
if(type==)
{
mul[i]=(LL)mul[i]*va%MOD;
sum[i]=(LL)sum[i]*va%MOD;
}else
{
cnt[i]++;
sum[i]+=(LL)val[i]*va%MOD;
if(sum[i]>=MOD)sum[i]-=MOD;
}
return ;
}
pushdown(i);
int mid=(l+r)>>;
if(mid>=pl)update(l,mid,pl,pr,type,va,lson);
if(pr>mid)update(mid+,r,pl,pr,type,va,rson);
pushup(i);
}
int query(int l,int r,int pl,int pr,int type,int i)
{
if(l>=pl&&r<=pr)
{
if(type==)return sum[i];
else return cnt[i];
}
pushdown(i);
int mid=(l+r)>>;
int tmp=;
if(pl<=mid)tmp+=query(l,mid,pl,pr,type,lson);
if(pr>mid)tmp+=query(mid+,r,pl,pr,type,rson);
if(tmp>=MOD)tmp-=MOD;
return tmp;
}
struct node
{
int a,b;
}s[N];
bool cmp(node a,node b)
{
return a.a<b.a;
}
int main() {
int n;
while(scanf("%d",&n)!=EOF)
{
int taila,tailb;
taila=tailb=;
for(int i=;i<n;++i)
{
scanf("%d%d",&s[i].a,&s[i].b);
qa[taila++]=s[i].a;
qb[tailb++]=s[i].b;
}
sort(s,s+n,cmp);
sort(qa,qa+taila);
sort(qb,qb+tailb);
taila=unique(qa,qa+taila)-qa;
tailb=unique(qb,qb+tailb)-qb;
int maxn=tailb-;
build(,maxn,);
int ans=;
for(int i=;i<n;++i)
{
int x=lower_bound(qb,qb+tailb,s[i].b)-qb;
int tmp=(LL)mypow(,s[i].a)*mypow(,s[i].b)%MOD;
int cc=;
if(x>)
{
cc=query(,maxn,,x-,,);
tmp=(LL)tmp*mypow(,cc)%MOD;
}
int tmp2=(LL)mypow(,s[i].a)*query(,maxn,x,maxn,,)%MOD;
tmp+=tmp2;
if(tmp>=MOD)tmp-=MOD;
ans+=tmp;
if(ans>=MOD)ans-=MOD;
// printf("::%d %d\n",x,maxn);
update(,maxn,x,maxn,,,);
update(,maxn,x,x,,mypow(,cc),);
}
printf("%d\n",(ans%MOD+MOD)%MOD);
} return ;
}

HDU 4913 Least common multiple(2014 Multi-University Training Contest 5)的更多相关文章

  1. HDU 4913 Least common multiple

    题目:Least common multiple 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4913 题意:有一个集合s,包含x1,x2,...,xn, ...

  2. ACM学习历程—HDU 3092 Least common multiple(数论 && 动态规划 && 大数)

    Description Partychen like to do mathematical problems. One day, when he was doing on a least common ...

  3. hdu 5003 模拟水题 (2014鞍山网赛G题)

    你的一系列得分 先降序排列 再按0.95^(i-1)*ai 这个公式计算你的每一个得分 最后求和 Sample Input12530 478Sample Output984.1000000000 # ...

  4. 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)

    作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...

  5. 千寻浏览器 1.0 Beta 1(524)(2014年5月27日)

    千寻浏览器--又一款新生浏览器今天进入各位浏览迷的视野.千寻浏览器基于IE内核,据传是由百度浏览器的上海团队操刀,在功能定位上,与目前的QQ浏览器有些相似. 千寻来自官方的解释:寻,追寻,探索,又是古 ...

  6. HDU 3416 Marriage Match IV (最短路径,网络流,最大流)

    HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...

  7. ( 2018 Multi-University Training Contest 2)

    2018 Multi-University Training Contest 2) HDU 6311 Cover HDU 6312 Game HDU 6313 Hack It HDU 6314 Mat ...

  8. hdu 2028 Lowest Common Multiple Plus(最小公倍数)

    Lowest Common Multiple Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  9. HDU——1019Least Common Multiple(多个数的最小公倍数)

    Least Common Multiple Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

随机推荐

  1. 杭电oj 1069 Monkey and Banana 最长递增子序列

    Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...

  2. [WIN32]Win7软件部署清单

    工具类 DreamWeaver8 网页 XAMPP 集成的服务器/数据库 EPP4 PHP IDE JDK7 Sublime Text 2 VMWare 虚拟机 Notepad++ FoxitRead ...

  3. HTML 5 的data-* 自定义属性

    HTML 5 增加了一项新功能是 自定义数据属性 ,也就是  data-* 自定义属性.在HTML5中我们可以使用以 data- 为前缀来设置我们需要的自定义属性,来进行一些数据的存放.当然高级浏览器 ...

  4. ROS探索总结(三)——ROS新手教程【转】

    转自:http://blog.csdn.net/hcx25909/article/details/8811313 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一ROS的 ...

  5. asp.net服务控件的生命周期

    1. 初始化 - Init事件 (OnInit 方法)   2. 加载视图状态 - LoadViewState方法   3. 处理回发数据 - LoadPostData方法           对实现 ...

  6. [课程设计]Scrum 2.0 多鱼点餐系统开发进度(第二阶段项目构思与任务规划)

    [课程设计]Scrum 2.0 多鱼点餐系统开发进度 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统WEB ...

  7. Cmap的使用

    1.定义 template <class KEY,class ARG_KEY,class VALUE, class ARG_VALUE> class CMap:public CObject ...

  8. 欧姆龙PLC---FINS/TCP

    ETN 21 以太网fins/tcp命令 (1)将电脑和PLC设置为同一个网段 例如电脑IP为192.168.18.214,PLC的IP为192.168.18.4(PLC的端口默认为9600) (2) ...

  9. [issue] dyld`dyld_fatal_error: -> 0x120015088 <+0>: brk #0x3

    iOS "dyld`dyld_fatal_error: -> 0x12000d088 <+0>: brk #0x3"错误 根据上面的博客里的方法二 尝试解决方法二 ...

  10. 手机测试pc端网页

    在这个问题上徘徊了 一个钟头了,终于被我找到方法了,就赶紧记下来,以后好查阅!! 主要问题在防火墙,防火墙阻当了80端口,所以怎么用手机访问都是访问不了的.把防火墙关闭就好了! 贴上httpd-vho ...