N.Particle Arts
题意:
n
n
n个数
a
i
a_i
ai,无限次操作,每次将
a
i
a_i
ai和
a
j
a_j
aj改为
a
i
&
a
j
a_i \&a_j
ai&aj和
a
i
∣
a
j
a_i |a_j
ai∣aj,求
1
n
∑
1
n
(
a
i
−
μ
)
2
\frac{1}{n}\sum_{1}^{n}(a_i - \mu)^2
n1∑1n(ai−μ)2趋于稳定时的值,其中
μ
=
1
n
∑
1
n
a
i
\mu =\frac{1}{n} \sum_{1}^{n}a_i
μ=n1∑1nai。
题解: 根据位运算的性质,
μ
\mu
μ的值不变,且每位上
1
1
1的个数不变。趋于稳定时,必有
a
&
b
=
a
a \& b =a
a&b=a或
a
&
b
=
b
a\&b = b
a&b=b,即每位必然是前一段全为
1
1
1,后一段全为
0
0
0。直接得到稳定后的
a
i
a_i
ai,计算即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100100;
int n,a[N],cnt[22];
ll sum1,sum2,sum3;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum1+=a[i];
for(int j=0;j<15;j++){
if(a[i]&(1<<j)) cnt[j]++;
}
}
for(int i=1;i<=n;i++){
a[i]=0;
for(int j=0;j<15;j++){
if(cnt[j]) a[i]+=(1<<j),cnt[j]--;
}
sum2+=a[i]*a[i];
sum3+=a[i];
}
ll up=sum2*n-2*sum1*sum3+sum1*sum1;
ll down=n*n;
ll gcd=__gcd(up,down);
printf("%lld/%lld\n",up/gcd,down/gcd);
return 0;
}
K.NIO’s Sword
题意: 玩家初始有一把攻击力为
0
0
0的剑,需要依次击杀
n
n
n个敌人,仅当攻击力模
n
n
n与
i
i
i同余才能击杀第
i
i
i个敌人。玩家可以升级剑,每次升级相当于在当前攻击力后面添加一个数字,问最少需要几次升级。
题解: 记
A
i
A_i
Ai为击杀第
i
i
i个怪物时的攻击力,特别地,
A
0
=
0
A_0 =0
A0=0。设为了击杀第
i
i
i只怪物进行了
k
i
k_i
ki次升级,则有
A
i
=
A
i
−
1
∗
1
0
k
i
+
x
i
A_i=A_{i-1}*10^{k_i}+x_i
Ai=Ai−1∗10ki+xi。即
A
i
−
1
∗
1
0
k
i
+
x
i
≡
i
m
o
d
n
A_{i-1}*10^{k_i}+x_i \equiv i \ mod\ n
Ai−1∗10ki+xi≡i mod n,
0
≤
x
i
<
1
0
k
i
0 \leq x_i < 10^{k_i}
0≤xi<10ki。枚举寻找最小的
k
i
k_i
ki即可。
注意:
n
=
1
n=1
n=1时,
a
n
s
=
0
ans=0
ans=0 !!!
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,ans;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
ll bas=1,las;
while(1){
bas*=10;ans++;
las=(i-(i-1)*bas%n+n)%n;
if(las<bas) break;
}
}
if(n==1) ans=0;
printf("%d\n",ans);
}