题目描述:
day1
转圈游戏:
最终位置实际上就是(x+m*10^k)%n
快速幂即可。
参考程序:
<span style="font-size:24px;">#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,k,x;
int power(int k){
if (k==1)return 10;
int x=power(k/2);
return ((x*x)%n)*(k&1?10:1)%n;
}
int main(){
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&k,&x);
printf("%d",(x+m*power(k))%n);
return 0;
}</span>
火柴排队:
根据感觉可知,大对大,小对小时可得到最小距离。
证明:设a1<a2,b1<b2 则(a1-b2)^2+(a2-b1)^2-(a1-b1)^2-(a2-b2)^2=2(b2-b1)(a2-a1)>0
将一个序列先排好,再将另一个序列先一一对应起来后,再找逆序对的个数即可。
用树状数组就可以解决。
参考程序:
<span style="font-size:24px;">#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 110000
using namespace std;
struct Match{
int num,id;
bool operator < (Match b)const{
return num<b.num;
}
}c[maxn],b[maxn];
int a[maxn];
int n;
void add(int x){
int i=x;