hiho 挑战赛7(有钱就是任性-dp与质数的因子)

题目4 : 有钱就是任性

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

俗话说,有钱就是任性。我们的高富帅鱼丸同学打算去看电影。鱼丸到了电影院以后,发现座位的编号正好是1到200。

但是有一些座位号对应的座位坏掉了,没法坐,不妨假设还剩下N个能坐的椅子。电影的老板告诉鱼丸,如果你要包下一个集合S里的所有椅子,就要付出这些椅子的编号的最小公倍数的钱。鱼丸很任性地同意了。

来这里玩了很多天以后,鱼丸发现自己正好来了2N-1天,并且由于他非常任性,对于这N个椅子的每一种可能的非空子集,他都包下过来看电影。鱼丸大少爷虽然不在乎花了多少钱,但你毕竟是他的助理,于是你想知道鱼丸一共花了多少钱。由于钱的数量实在太大,请对答案mod
109+7之后输出。

输入

第一行输入一个数N(1 <= N <= 200),表示能做的椅子的数量。

接下来一行N个1到200之间的整数,用空格隔开。

输出

一行输出答案。

样例输入
2
2 4
样例输出
10

本题是dp,但是map存不下那么大的数(lcm(1,2,...,200)),所以考虑压缩

容易想到≤n的数p>sqrt(n)的只出现一次,

所以可以将它们压缩a1*a2*...*a[m-1]*p=n 压缩为a1*a2*...*a[m-1]

f(i)表示lcm=i的次数

因为让f(a1*a2*...*a[m-1])+=p*f(a1*a2*...*a[m-1]*p)不影响结果就可以了,

值得注意的是f()中的数可能已经超过F了,要先取模以防溢出

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
#include<map>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define MAXN (2000+10)
#define N (200)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
void upd(ll &a,ll b){a=(a+b)%F;}
int n,a[MAXN],p[MAXN],tot=0;
bool b[MAXN]={0};
map<ll,ll> f[2];
ll gcd(ll a,ll b){if (b==0) return a;return gcd(b,a%b);}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
void make_prime(int n)
{
	Fork(i,2,n)
	{
		if (!b[i]) p[++tot]=i;
		For(j,tot)
		{
			if (i*p[j]>n) break;
			b[i*p[j]]=1;
			if (i%p[j]==0) break;
		}
	}
}
int cnt[MAXN]={0};
ll pw2[MAXN]={1,2,4,8,16,32,64,128,256,512,1024,
2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,
2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,73741817,
147483634,294967268,589934536,179869065,359738130,719476260,438952513,877905026,755810045,511620083,
23240159,46480318,92960636,185921272,371842544,743685088,487370169,974740338,949480669,898961331,
797922655,595845303,191690599,383381198,766762396,533524785,67049563,134099126,268198252,536396504,
72793001,145586002,291172004,582344008,164688009,329376018,658752036,317504065,635008130,270016253,
540032506,80065005,160130010,320260020,640520040,281040073,562080146,124160285,248320570,496641140,
993282280,986564553,973129099,946258191,892516375,785032743,570065479,140130951,280261902,560523804,
121047601,242095202,484190404,968380808,936761609,873523211,747046415,494092823,988185646,976371285,
952742563,905485119,810970231,621940455,243880903,487761806,975523612,951047217,902094427,804188847,
608377687,216755367,433510734,867021468,734042929,468085851,936171702,872343397,744686787,489373567,
978747134,957494261,914988515,829977023,659954039,319908071,639816142,279632277,559264554,118529101,
237058202,474116404,948232808,896465609,792931211,585862415,171724823,343449646,686899292,373798577,
747597154,495194301,990388602,980777197,961554387,923108767,846217527,692435047,384870087,769740174,
539480341,78960675,157921350,315842700,631685400,263370793,526741586,53483165,106966330,213932660,
427865320,855730640,711461273,422922539,845845078,691690149,383380291,766760582,533521157,67042307,
134084614,268169228,536338456,72676905,145353810,290707620,581415240,162830473,325660946,651321892,
302643777,605287554,210575101,421150202,842300404,684600801,369201595,738403190,476806373,953612746,
907225485,814450963,628901919,257803831,515607662,31215317,62430634,124861268,249722536,499445072
};
bool use[MAXN]={0};
int main()
{
//	freopen("hiho1113.in","r",stdin);
//	freopen("hiho1113.out","w",stdout);
	make_prime(200);
	cin>>n;
	For(i,n) cin>>a[i],cnt[a[i]]++;

	bool ct=0;
	f[0][1]=1; //假设一开始有一个空集 lcm(φ)=1的 ,显然lcm(φ,a,b,c..)=lcm(a,b,c..)
	// 后面 则是 {解集}+元素i
	ForD(j,tot)
		if (p[j]*p[j]>N) //若p[j]*k=N=200 则 k<sqrt(N)<p[j]
		{
			for(int k=1;k<=N/p[j];k++)
			{
				int i=k*p[j];use[i]=1;
				if (!cnt[i]) continue;
				for(map<ll,ll>::iterator it=f[ct].begin();it!=f[ct].end();it++)
				{
					ll c=it->first,v=it->second;
					upd(f[ct^1][c],f[ct][c]); //有可能之前在lcm时改过
					upd(f[ct^1][lcm(c,i)],mul(f[ct][c],sub(pw2[cnt[i]],1)));
				}
				f[ct].clear();
				ct^=1;
			}
			//显然p[j]最多 出现1次,且之后不出现,故 把p[j]"删"去不对答案影响 f(i)表示 lcm(..)=i的数的个数
			//eg cost=2*f(2)+2*56*f(2*56) = 2*F(2) F(2)=(f(2)+56*f(2*56))
			//添加17 ->  F(2*17)=f(2*17)+56*f(2*17*56)
			for(map<ll,ll>::iterator it=f[ct].begin();it!=f[ct].end();it++)
			{
				ll c=it->first,v=it->second;
				if (c%p[j]==0) upd(f[ct^1][c/p[j]],mul(v,p[j]));
				else upd(f[ct^1][c],v);
			}
			f[ct].clear();
			ct^=1;
		}
	For(i,N)
	{
		if (use[i]) continue;
		if (!cnt[i]) continue;
		for(map<ll,ll>::iterator it=f[ct].begin();it!=f[ct].end();it++)
		{
			ll c=it->first,v=it->second;
			upd(f[ct^1][c],f[ct][c]); //有可能之前在lcm时改过
			upd(f[ct^1][lcm(c,i)],mul(f[ct][c],sub(pw2[cnt[i]],1)));
		}
		f[ct].clear();
		ct^=1;
	}

	ll ans=0;

	for(map<ll,ll>::iterator it=f[ct].begin();it!=f[ct].end();it++)
		upd(ans,mul((it->first)%F,(it->second)%F));
	cout<<sub(ans,1)<<endl;

	return 0;
}
时间: 2024-12-07 02:25:54

hiho 挑战赛7(有钱就是任性-dp与质数的因子)的相关文章

阿里巴巴市值超越纳斯达克中国所有概股市值总和,有钱,任性

淘宝安全交易平台 www.xunjie36.com 淘宝店铺出售www.360feiyue.com 淘宝店铺交易www.360feiyue.com[关键词]淘宝安全交易平台 www.xunjie36.com 淘宝店铺出售www.360feiyue.com 淘宝店铺交易www.360feiyue.comwww 阿里巴巴近期股价的孱弱表现或许与中国a股市场的"任性"有关,美股市场里中概股资金回流中国让中概股多数遭遇暴跌的惨况.不过,分析人士指出,中国移动社交应用陌陌的上市,也越发让阿里巴巴

《跨界杂谈》砸300亿美金与政府对垒,有钱就是任性---谈互联网化政府和政府互联网化

砸300亿美金与政府对垒,有钱就是任性 ---谈互联网化政府和政府互联网化 本文纯属虚构,若有雷同,纯属巧合 先引用一个微博: 2040年,杭州-"尼玛,当年真不应该跟工商总局斗!"..... 1.大型互联网厂商已经具备部分准政府职能 大型互联网厂商不仅拥有数亿的用户,还有数百万的企业(数亿企业员工)基于互联网厂商的平台开展业务.因此大型互联网厂商,可以获得海量的用户信息,这些信息可能包括但不限于:用户姓名.身份证号.家庭住址.电话.单位地址.亲友关系(公开关系.私密关系).商业关系.

互联网健康领域并购加速,天鸽互动诠释有钱就是任性

互联网行业对医疗行业的改造正在逐步深入,以健康服务这个细分领域为例,近年来已经有不少案例可以反映这一点,比如百度等互联网巨头在积极通过平台.大数据布局健康服务:另外,诸如上海松江区中心医院就推出了手机客户端,打造掌上健康服务,试图挖掘线上市场,这是传统医院往线上拓展的典型案例.除此之外,还有很多健康类网站,他们经过多年的积累在互联网健康服务方面也取得了不错的成绩,寻医问药网.好大夫在线.39健康网就是其中的典型. 不过在笔者看来,目前互联网健康服务仍处于发展初期,未来潜力无限,而要真正将这一领域

试用期升职?不只有钱才任性!

我叫杨天,长春工业大学的一颗小草(不是校草-哭!),我其貌不扬,但是我不小心成为了一段江湖传说. 传说是这样发生的: 上篇讲到我在好程序员经过了四个月的魔鬼式培训,顺利掌握了闯荡江湖的武林秘籍:从最简单的编程语言PASCAL语言,到流行的VB.VC.FoxPro.Delph等.顺利成为了月薪12K的程序猿.试用期2个月. 如果这就是结尾,江湖上也不再有我的传说. 前几天,老板心血来潮的找我谈谈心,我这颗小心脏,紧张的扑通扑通乱跳,节奏好似那首<双节棍>毫无断点. "小杨啊,来公司快2

有钱就是任性!NBA球星每周花1000美元玩手游

说到NBA球星沙奎尔•奥尼尔,想必很多篮球粉丝应该都认识.1972年3月6日出生于美国新泽西内瓦克,是美国著名职业篮球运动员,也是NBA实 力最强中锋之一.曾效力于NBA奥兰多魔术队和洛杉矶湖人队.迈阿密热火队.菲尼克斯太阳队.克里夫兰骑士队以及波士顿凯尔特人队. NBA球星沙奎尔•奥尼尔 在问到喜欢什么样的手机应用时,奥尼尔不假思索的回答“游戏”.而且最喜欢的是<myVEGAS>,这款游戏是Playstudios开发的一款社交博彩游戏,最大的特点是模拟真正的laohuji,加上逼真的音效,玩

#IT互联网财经时事每月谈,中国黑五有钱、任性#

时至寒冬,互联网竟然也一片死亡的气息,iPhone6依旧热卖,但由它的同类引发的技术和商业革命正不断冲击着传统架构:小灵通钉子户难阻时代挖掘机,而文化部对网吧放开审批,也有点"尊重亡灵"的味道:国内两家字幕组网站同时关闭,让人黯然神伤,本月唯一让人高兴的事儿:国内消费者终于可以买到国外商品了,但也要提防假货,祈祷物流飞机不要失去联系. #鸠占鹊巢,小灵通现钉子用户#日前,北京联通宣布将于2014年12月31日停止小灵通服务,公示的理由是,因本地无线环路业务的设备供应和技术支持等方面的原

hiho 挑战赛11(随机斐波那契-算期望找规律)

题目1 : 随机斐波那契 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 大家对斐波那契数列想必都很熟悉: a0 = 1, a1 = 1, ai = ai-1 + ai-2,(i > 1). 现在考虑如下生成的斐波那契数列: a0 = 1, ai = aj + ak, i > 0, j, k从[0, i-1]的整数中随机选出(j和k独立). 现在给定n,要求求出E(an),即各种可能的a数列中an的期望值. 输入 一行一个整数n,表示第n项.(1<=n<

hiho 挑战赛10(01串-找规律决策)

题目1 : 01串 时间限制:7000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个整数n和m,求是否存在恰好包含n个0和m个1的01串S,使得S中不存在子串"001"和"11". 如果存在符合条件的01串则输出字典序最小的S,否则输出NO. 输入 一行两个整数,表示n和m.(0<=n,m<=100000,0<n+m) 输出 一行一个字符串,为字典序最小的S或者NO. 样例输入 2 3 样例输出 10101 本题的关键在找规律

百度有钱就是任性!一分钱活动,百度带你飞翔.....

还没入手的朋友抓紧- 百度钱包官方活动真实有效,本人亲测,收到一副手套,免邮费的, 官方活动地址:http://1.baidu.com/?invite_code=LRW5LPLQ 另外还可以推荐给其他人,推荐一人可以得到10元的现金 昨日小试一下..