codeforce 157 div 2

A,B,C都很水,就不说了。。
D题,求范围是1到m的某种序列的个数,该序列长度为7,某一个数包含的4,7个数大于其他6个数的4,7个数总和
ci表示含4,7个数为i的数个数(ci可暴出来),据此分组,枚举某一数所在的组,然后暴出此时的其他6个数的种类数即可。
E题:一个长度为n的序列,lcm(b1..bn) = max(b1..bn),且bi <= ai,给出n和a1..an,求出序列b的个数
1.枚举最大值m

2.求出m个所有因子,排序

3.将a1-n按照[0,ai]的因子个数划分区间

4.每个区间里元素的种类数是因子数^区间长度

5.累乘每个区间的结果即可

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <cassert>
using namespace std;

#define pf(x) printf("%d\n",x)
#define pf2(x,y) printf("%d %d\n",x,y)
#define pf3(x,y,z) printf("%d %d %d\n",x,y,z)
#define pf4(x,y,z,k)printf("%d %d %d %d\n",x,y,z,k)
#define sf(x) scanf("%d",&x)
#define sf2(x,y) scanf("%d %d",&x,&y)
#define sf3(x,y,z) scanf("%d %d %d",&x,&y,&z)

typedef long long ll;
double const eps = 1e-6;
const int inf = 0x3fffffff;
const int size = 100000 + 5;
const int mod = 1e9 + 7;
int a[size];
vector<int> fac;
int n;
ll qpow(ll a,int b)
{
	ll ans = 1;
	while(b){
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	while(ans < 0);
	return ans;
}
ll cal(int m)
{
	fac.clear();
	for(int i = 1; i*i <= m; i++){
		if(m % i == 0) {
			fac.push_back(i);
			if(i * i != m) fac.push_back(m/i);
		}
	}
	sort(fac.begin(),fac.end());
	int sz = fac.size();
	int cur = 0,pre = 0;
	ll ret = 1;
	for(int i = 0; i < sz; i++){
		cur = lower_bound(a,a+n,fac[i]) - a;	
		ret = ret * qpow(i,cur-pre) % mod;	
		pre = cur;
	}
	assert(ret >= 0);
	ret = ret * (qpow(sz,n-pre) - qpow(sz-1,n-pre) + mod) % mod;
	return ret;
}
int main()
{
	sf(n);
	for(int i = 0; i < n; i++)
		sf(a[i]);
	sort(a,a+n);
	ll ans = 0;
	for(int k = 1; k <= a[n-1]; k++){
		ans = (ans + cal(k) ) % mod;
//		cout << ans << endl;
	}
	pf((int)ans);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值