# xjoi省选模拟赛_14

T1 发现 对于当前 投出 奇数次向上的概率为 p 那么 若加入一个 pi=0.5 的骰子

``` 1 #include <bits/stdc++.h>
2 #define N 100
3 #define eps 1e-7
4 using namespace std;
5 typedef long double ldb;
6 int t,n;
7 ldb A[N];
8 int main()
9 {
10     scanf("%d",&t);
11     while(t--)
12     {
13         scanf("%d",&n);
14         for(int i=1;i<=n;i++)
15             scanf("%Lf",&A[i]);
16         int tot1=0;
17         for(int i=1;i<=n;i++)
18             if(fabs(A[i]-0.5)>eps) tot1++;
19         printf("%lld\n",(1ll<<n)-(1ll<<tot1));
20     }
21     return 0;
22 }```

``` 1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
5 {
6     ll x=0,f=1;char ch=getchar();
7     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
8     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
9     return x*f;
10 }
11 struct food
12 {
13     ll p,s;
14 }a[500],b[500];
15 ll t,n,m,f;
16 int tot;
17 inline bool cmp1(const food&a,const food&b)
18 {
19     return (a.s==b.s)? a.p<b.p:a.s<b.s;
20 }
21 inline bool cmp2(const food&a,const food&b)
22 {
23     return a.p<b.p;
24 }
25 ll get(ll x)
26 {
27     ll left=m-x*f,ans=0,tmp,now=0;
28     if(left<0) return 0;
29     for(int i=1;i<=tot;i++)
30     {
31         ll s=b[i].s,p=b[i].p;
32         if(now<=s) tmp=min(s-now+1,left/(p*x)),ans+=tmp*x,left-=p*x*tmp,now+=tmp;
33         if(now<=s) tmp=min(x,left/p),ans+=tmp,left-=p*tmp,now++;
34     }
35     return ans;
36 }
37 int main()
38 {
40     for(int i=1;i<=n;i++)
42     sort(a+1,a+1+n,cmp1);b[1]=a[1];tot=1;
43     for(int i=1;i<=n;i++)
44         if(a[i].s>b[tot].s) b[++tot]=a[i];
45     sort(b+1,b+1+tot,cmp2);
46     if(f+a[1].p>m)
47     {
48         printf("0\n");
49         return 0;
50     }
51     ll l=1,r=m/(b[1].p+f),ans=max(get(l),get(r));
52     while(l+20<r)
53     {
54         ll tot=(r-l+1);
55         ll ansl=get(l+tot/3),ansr=get(l+2*tot/3);
56         if(ansl<ansr) ans=max(ansl,ans),l=l+tot/3+1;
57         else ans=max(ansr,ans),r=l+tot*2/3-1;
58     }
59     for(int i=l;i<=r;i++)
60         ans=max(ans,get(i));
61     printf("%lld\n",ans);
62     return 0;
63 }```

``` 1 #include <bits/stdc++.h>
2
3 using namespace std;
4 typedef double ldb;
5 int n,A[55][55],vis[55],last,cnt;
6 ldb ans;
7 ldb dd(int x)
8 {
9     int g[55];g[0]=0;
10     ldb tmp=0;
11     for(int i=0;i<n;i++) if(x&(1<<i)) g[++g[0]]=i+1;
12     for(int i=1;i<=g[0];i++)
13         for(int j=i+1;j<=g[0];j++)
14             tmp+=(ldb)A[g[i]][g[j]];
15     return tmp/(ldb)(g[0]*(200-g[0]));
16 }
17 void solve()
18 {
19     double t=1.0;
20     while(t>0.00000001)
21     {
22         int p=rand()%2;
23         if(!p)
24         {
25             if(!cnt) continue;
26             int x=rand()%n+1;
27             if(!vis[x]) continue; int rel=0;
28             for(int i=1;i<=n;i++) if(vis[i]) rel+=A[x][i];
29             double tmp=last-rel;
30             if(ans<tmp/double(cnt-1)/double(201-cnt)||double(rand()%10000)/10000.0<t)
31                 last=tmp,ans=tmp/double(cnt-1)/double(201-cnt),cnt--,vis[x]=0;
32         }
33         else
34         {
35             int x=rand()%n+1;
36             if(vis[x]) continue;int rel=0;
37             for(int i=1;i<=n;i++) if(vis[i]) rel+=A[x][i];
38             double tmp=last+rel;
39             if(ans<tmp/double(cnt+1)/double(199-cnt)||double(rand()%10000/10000.0<t))
40                 last=tmp,ans=tmp/double(cnt+1)/double(199-cnt),cnt++,vis[x]=1;
41         }
42         t*=0.99999;
43     }
44     printf("%.5lf\n",ans);
45 }
46 int main()
47 {
48     srand(time(0));
49     scanf("%d",&n);
50     for(int i=1;i<=n;i++)
51         for(int j=1;j<=n;j++)
52             scanf("%d",&A[i][j]);
53     if(n<=15)
54     {
55         for(int i=0;i<(1<<15);i++)
56             ans=max(ans,dd(i));
57         printf("%.5lf\n",ans);
58     }
59     else solve();
60     return 0;
61 }```

## 2018/3/27 省选模拟赛 140分

T1 树归 100 T2 写的快速幂卷积 40,超时了,正解是矩阵乘法之类的. 正解 1 暴力(m<=5):将x的所有约数提出来矩阵乘法 2 3 定义乘法同构: 4 A=p[1]^a[1] * p[2]^a[2] * ... * p[n]^a[n] 5 B=q[1]^b[1] * q[2]^b[2] * ... * q[n]^b[n] 6 其中p[i]与q[i]皆为质数 7 将数组a与b降序排序后如果是完全相同的,那么称A与B是乘法同构的 8 如 2*2*2*2*3*3*5 与 7*11*11*

## 2018.6.29 省选模拟赛

*注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 小D与电梯 Problem B 小D与田野 Problem C 小D与函数 Problem A 小D与电梯 题目大意 假设电梯在0层,容量无限大.给定\$n\$个人的到达时间和要去的楼层.电梯上下一层楼花费的时间为1,电梯开关门.乘客上下的耗时不计,电梯可以停留在某一层楼.问将所有人送达到目的地,并让电梯回到0层的最少耗时. 先按到达时间将所有人排序.显然,每次电梯运输的人是一段连续的区间中的人. 用\$f[i]\$表示将前\$