2021.7.16
2021.7.16
2021.7.16 模拟赛
Ⅳ
Ⅳ
Ⅳ
目录:
T1.Colorful Circle
T2.Reflect Damage
T3.ptyNB!
T4.Image Recognition
T 1 : C o l o r f u l T1:Colorful T1:Colorful C i r c l e Circle Circle
分析:
期望
d
p
dp
dp
f
i
,
0
/
1
f_{i,0/1}
fi,0/1表示到第
i
i
i个宝石 当前最后一个宝石 和最前面宝石颜色相同的期望
然后注意环 判
i
=
n
i=n
i=n的情况
那么就是期望
×
\times
× 长度
×
\times
× 概率了 注意颜色数量的变化
以及精度 注意保留 或
e
p
s
eps
eps
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=205;
int n,m;
long double P[N],p,ans,f[N][2];
int main(){
scanf("%d%d",&n,&m);
if(m==1){
printf("%d",n);
return 0;
}
p=1.0000/(m*1.0000);
P[0]=1.0000;
for(int i=1;i<=n;i++)
P[i]=P[i-1]*p; //概率
for(int i=1;i<=n;i++)
{
memset(f,0,sizeof f);
f[i][1]=1.0000;
if(i==n){
ans+=P[n]*n*1.0000*(m*1.0000);
continue;
}
for(int j=i;j<=n;j++)
for(int k=j+1;k<=n;k++)
{
f[k][0]+=f[j][0]*P[k-j]*(k-j)*1.0000*(m*1.0000-2.0000)+f[j][1]*P[k-j]*(k-j)*1.0000*(m*1.0000-1.0000);
f[k][1]+=f[j][0]*P[k-j]*(k-j)*1.0000;
}
for(int j=0;j<=n-i;j++)
ans+=f[n-j][0]*P[i+j]*(i+j)*m*1.0000;
}
printf("%.10Lf",ans);
return 0;
}
T 2 : R e f l e c t T2:Reflect T2:Reflect D a m a g e Damage Damage
分析:
a
n
s
i
ans_i
ansi为
i
i
i最终受到的伤害
G
i
G_i
Gi为
i
i
i受伤害占总伤害比例
T
i
,
j
T_{i,j}
Ti,j为
i
i
i对
j
j
j伤害的比例
i
i
i受伤害肯定都来自别人给的 加上初始的
那么就有:
a
n
s
i
G
i
=
∑
j
≠
i
a
n
s
j
G
j
×
T
j
,
i
+
a
i
\frac{ans_i}{G_i}=\sum_{j≠i}\frac{ans_j}{G_j}\times T_{j,i}+a_i
Giansi=j=i∑Gjansj×Tj,i+ai
于是直接高斯消元解方程
CODE:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define eps 1e-9
using namespace std;
const int N=205;
int n,m,a[N];
long double T[N][N],Matrix[N][N],ans[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
T[i][i]=1;
}
scanf("%d",&m);
while(m--)
{
int x,y;
double div;
scanf("%d%d%lf",&x,&y,&div);
T[x][x]-=div;T[x][y]+=div;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
if(i^j) Matrix[i][j]=-T[j][i]/T[j][j];
Matrix[i][i]=1.0/T[i][i];
Matrix[i][n+1]=-a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
if(fabs(Matrix[j][i])>eps)
{
for(int k=i;k<=n+1;k++)
swap(Matrix[i][k],Matrix[j][k]);
break;
}
long double qwq=Matrix[i][i];
for(int j=i;j<=n+1;j++)
Matrix[i][j]/=qwq;
for(int j=i+1;j<=n;j++)
{
qwq=Matrix[j][i];
for(int k=i;k<=n+1;k++)
Matrix[j][k]-=Matrix[i][k]*qwq;
}
}
ans[n+1]=1;
for(int i=n;i>=1;i--)
for(int j=i+1;j<=n+1;j++)
ans[i]-=Matrix[i][j]*ans[j];
for(int i=1;i<=n;i++)
printf("%.6Lf\n",ans[i]);
return 0;
}
T 3 : T3: T3:鱼跃龙门
分析:
至于
p
t
y
N
B
ptyNB
ptyNB 应该是胖头鱼
n
b
nb
nb吧
与青蛙的约会类似
e
x
g
c
d
exgcd
exgcd
要满足
x
(
x
+
1
)
2
%
n
=
0
\frac{x(x+1)}{2}\%n=0
2x(x+1)%n=0 那么
n
∣
x
(
x
+
1
)
2
n|\frac{x(x+1)}{2}
n∣2x(x+1) 就是
2
n
∣
x
(
x
+
1
)
2n|x(x+1)
2n∣x(x+1)了
p
q
=
2
n
pq=2n
pq=2n 设
x
=
q
b
,
x
+
1
=
p
a
x=qb,x+1=pa
x=qb,x+1=pa 就是
a
p
−
b
q
=
1
ap-bq=1
ap−bq=1
就直接
e
x
g
c
d
exgcd
exgcd 即可
CODE:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int T;
const int N=1e6+5;
const ll inf=1e18;
bool isprime[N];
int prime[N],tot,cnt;
ll n,fac[55],ans,x,y;
void Prime()
{
memset(isprime,1,sizeof isprime);
isprime[0]=isprime[1]=0;
for(int i=2;i<N;i++)
{
if(isprime[i])
prime[++tot]=i;
for(int j=1;j<=tot&&i*prime[j]<N;j++)
{
isprime[i*prime[j]]=0;
if(i%prime[j]==0) break;
}
}
}
void factor(ll x)
{
cnt=0;
for(int i=1;i<=tot&&prime[i]<=x;i++)
{
if(x%prime[i]==0)
{
fac[++cnt]=1;
while(x%prime[i]==0)
x/=prime[i],fac[cnt]*=prime[i];
}
}
if(x) fac[++cnt]=x;
}
void exgcd(ll a,ll b)
{
if(b==0)
{
x=1;
y=0;
return;
}
exgcd(b,a%b);
ll k=x;
x=y;y=k-a/b*y;
}
void dfs(int dep,ll a,ll b)
{
if(dep==cnt+1)
{
exgcd(a,b);
y=(-y)%a;
if(y<=0) y+=a;
ans=min(ans,y*b);
return;
}
dfs(dep+1,a*fac[dep],b);
dfs(dep+1,a,b*fac[dep]);
}
int main(){
Prime();
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
if(n==1){
puts("1");
continue;
}
n<<=1;
factor(n);
ans=inf;
dfs(1,1,1);
printf("%lld\n",ans);
}
return 0;
}
T 4 : I m a g e T4:Image T4:Image R e c o g n i t i o n Recognition Recognition
分析:
数据近似随机 所以 O ( n 2 ) O(n^2) O(n2)可过
把
64
64
64位整数 划分成
4
4
4块 每块
16
16
16位
那么根据小学知识 如果存在汉明距离为
3
3
3
4
4
4块里肯定有
1
1
1块相同
那就以这个
16
16
16位整数 作为
m
a
p
map
map的引索 遍历可能的即可
注意
64
64
64位开
u
n
s
i
g
n
e
d
unsigned
unsigned
l
o
n
g
long
long
l
o
n
g
long
long
CODE:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
typedef unsigned long long ull;
const int N=150005;
int n,next[N][5],vis[N],ans;
ull key=(1<<16),k[N],qwq[N][5];
map<ull,int> G[5];
ull lowbit(ull x){return x&(-x);}
bool check(ull x,ull y)
{
ull val=x^y;
int dis=0;
while(val)
{
++dis;
if(dis>3) return 0;
val-=lowbit(val);
}
return dis==3;
}
int main(){
// freopen("hashing.in","r",stdin);
// freopen("hashing.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
ull x; ans=0;
scanf("%llu",&x);
k[i]=x;
for(int j=1;j<=4;j++)
qwq[i][j]=x%key,x/=key;
for(int j=1;j<=4;j++)
{
if(G[j].find(qwq[i][j])!=G[j].end())
{
next[i][j]=G[j][qwq[i][j]];
for(int p=next[i][j];p;p=next[p][j])
{
if(vis[p]==i) continue;
vis[p]=i;
if(check(k[i],k[p]))
ans++;
}
}
G[j][qwq[i][j]]=i;
}
printf("%d\n",ans);
}
return 0;
}