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;
}