2019牛客多校

B. Integration

题意

已知 $Large int_{0}^{infty} frac{1}{1+x^{2}} mathrm{d} x=frac{pi}{2}$ ,求 $Largefrac{1}{pi} int_{0}^{infty} frac{1}{prod_{i=1}^{n}left(a_{i}^{2}+x^{2}right)} mathrm{d} x$

题解

由 $largefrac 1 atimes frac 1 b=(frac 1 a-frac 1 b)times frac 1 {(b-a)}$ ,获得启发,化乘为加,令 $large c_i=prodlimits_{jne i}frac 1 {a_j^2-a_i^2}$ ,则 $largeprod frac 1 {(a_i^2+x^2)}=sum frac {c_i}{a_i^2+x^2}$

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94

using namespace std;
#define forl(i, l, r) for (int i = l; i <= r; i++)
#define forr(i, r, l) for (int i = r; i >= l; i--)
#define for1(i, n) for (int i = 1; i <= n; i++)
#define fro1(i, n) for (int i = 1; i <= n; i++)
#define for0(i, n) for (int i = 0; i < n; i++)
#define fro0(i, n) for (int i = 0; i < n; i++)
#define meminf(a) memset(a, inf, sizeof(a))
#define mem_1(a) memset(a, -1, sizeof(a))
#define mem0(a) memset(a, 0, sizeof(a))
#define memcp(a,b) memcpy(a,b,sizeof(b))
#define oper(type) bool operator <(const type y)const
#define mp make_pair
#define pu_b push_back
#define pu_f push_front
#define po_b pop_back
#define po_f pop_front
#define fi first
#define se second
#define whiel while
#define retrun return
typedef pair<long long, long long> pll;
typedef vector<long long> vll;
typedef pair<int, int> pii;
typedef unsigned long long ull;
typedef vector<int> vii;
typedef double db;
typedef long long ll;
typedef int itn;
void (initializer_list<int*> li){for(auto ptr=li.begin();ptr!=li.end();ptr++)scanf("%d",*ptr);}
void (initializer_list<ll*> li){for(auto ptr=li.begin();ptr!=li.end();ptr++)scanf("%lld",*ptr);}
void (initializer_list<db*> li){for(auto ptr=li.begin();ptr!=li.end();ptr++)scanf("%lf",*ptr);}
void out(initializer_list<int> li){for(auto ptr=li.begin();ptr!=li.end();ptr++)printf("%d ",*ptr);}
void outln(initializer_list<int> li){for(auto ptr=li.begin();ptr!=li.end();ptr++)printf("%dn",*ptr);}
void out(initializer_list<ll> li){for(auto ptr=li.begin();ptr!=li.end();ptr++)printf("%lld ",*ptr);}
void outln(initializer_list<ll> li){for(auto ptr=li.begin();ptr!=li.end();ptr++)printf("%lldn",*ptr);}
int (int &a,int &b,int &c,int &d){return scanf("%d%d%d%d",&a,&b,&c,&d);}
int (int &a,int &b,int &c){return scanf("%d%d%d",&a,&b,&c);}
int in(int &a,int &b){return scanf("%d%d",&a,&b);}
int in(ll &a){return scanf("%lld",&a);}
int in(int &a){return scanf("%d",&a);}
int in(char *s){return scanf("%s",s);}
int in(char &c){return scanf("%c",&c);}
void out(int a,bool ln){printf("%d%c",a,ln? 'n':' ');}
void out(ll a,bool ln){printf("%lld%c",a,ln? 'n':' ');}
void out(db a,int digit,bool ln){printf("%.*f%c",digit,a,ln? 'n':' ');}
const db pi = acos((db)-1);
const ll inf =0x3f3f3f3f;
const db eps = 1e-8;
const int N = 1.1e3;
const int M = 2.1e5;
const ll mod = 1e9+7;
int sign(db a) {return a < -eps ? -1 : a > eps;}
int db_cmp(db a, db b){ return sign(a-b);}

int a[N];
ll qPow(ll a, ll b, ll c) {
ll ret = 1;
while (b) {
if (b & 0x1) ret = ret * a % c;
a = a * a % c;
b >>= 1;
}
return ret;
}
int main() {
#ifdef PerpEternal
freopen("/Users/perpeternal/Documents/Sketch/data/in.dat", "r", stdin);
// freopen("/Users/perpeternal/Documents/Sketch/data/out.dat", "w", stdout);
#endif
//ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n;
while(~in(n)){
for1(i,n)in(a[i]);
// if(n==1){
// out(qPow(2ll*a[1],mod-2,mod),1);
// continue;
// }
ll ans=0;
for1(i,n){
ll tm=1;
for1(j,n){
if(j!=i){
tm=tm*((1ll*a[j]*a[j]%mod-1ll*a[i]*a[i]%mod+mod)%mod)%mod;
// tm=tm*qPow((1ll*a[j]*a[j]%mod-1ll*a[i]*a[i]%mod+mod)%mod,mod-2,mod)%mod;
}
}
ans=(ans+qPow(2*a[i],mod-2,mod)*qPow(tm,mod-2,mod)%mod)%mod;
}
out(ans,1);
}
return 0;
}

C. Euclidean Distance

题意

给一个点 $(frac {a_1} m,frac {a_2} m,cdots,frac {a_n} m)(-mle a_ile m)$ ,找到一个点 $P(p_1,p_2,cdots,p_n)(p_ige 0,sum p_i=1)$ 使得 $sum (frac {a_i}m-p_i)^2$ 最小

题解

对 $a_i$ 排序,逐渐减小最大的 $a_i$ ,使得序列的最大值尽可能小

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
bool cmp(int x,int y){
return x>y;
}
ll gcd(ll x,ll y){
return y?gcd(y,x%y):x;
}
struct fraction{
ll son, mom;
fraction(){}
fraction(ll a,ll b){
if(a){ll gc=gcd(abs(a),abs(b));if(b<0) son=-a/gc,mom=-b/gc;else son=a/gc,mom=b/gc;}
else son=0,mom=1;
}
bool operator==(const fraction &x)const{
return son==x.son&&mom==x.mom;
}
bool operator!=(const fraction &x)const{
return !(son==x.son&&mom==x.mom);
}
bool operator<(const fraction &y)const{
return son * y.mom < y.son * mom;
}
bool operator<=(const fraction &y)const{
return son * y.mom <= y.son * mom;
}
fraction operator*(const fraction &y)const{
return fraction(son*y.son,mom*y.mom);
}
fraction operator+(const fraction &y)const{
return fraction(son * y.mom + y.son * mom,mom*y.mom);
}
fraction operator/(const fraction &y)const{
return fraction(son*y.mom,mom*y.son);
}
fraction operator-(const fraction &y)const{
return fraction(son * y.mom - y.son * mom,mom*y.mom);
}
void display(){
if(mom==1)printf("%lldn",son);
else printf("%lld/%lldn",son,mom);
}
};
int main() {
#ifdef PerpEternal
// freopen("/Users/perpeternal/Documents/Sketch/data/in.dat", "r", stdin);
// freopen("/Users/perpeternal/Documents/Sketch/data/out.dat", "w", stdout);
#endif
//ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n,m,a[N];
while(~in(n)){
in(m);
for0(i,n)in(a[i]);
sort(a,a+n,cmp);
int remain=m;
int i=1;
for(;i<n;i++){
if(i*(a[i-1]-a[i])<=remain){
remain-=i*(a[i-1]-a[i]);
}else break;
}
fraction ans=fraction(i*a[i-1]*a[i-1]-2*remain*a[i-1],1)+fraction(remain*remain,i);
for(;i<n;i++){
ans=ans+fraction(a[i]*a[i],1);
}
ans=ans/fraction(m*m,1);
ans.display();
}
return 0;
}