首页 > 代码库 > 【NOIP2013TG】solution

【NOIP2013TG】solution

D1T1:转圈游戏(circle)

题意:看题目。。

解题思路:快速幂求m*10^kmodn即可。

#include<stdio.h>
#define ll long long
#define For(i,a,b) for(int i=a; i<=b; i++)
#define Ford(i,a,b) for(int i=a; i>=b; i--)
#define File(fn) freopen(fn".in","r",stdin);freopen(fn".out","w",stdout);
int n,m,k,x;
inline int in(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<0||ch>9) f=ch==-?-1:1,ch=getchar();
    while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return x*f;
}
inline void print(int x,char ch){
    if (!x){
        putchar(0);
        putchar(ch);
        return;
    }
    if (x<0){
        putchar(-);
        x*=-1;
    }
    char num[10];
    short cnt=0;
    while(x) num[++cnt]=x%10+0,x/=10;
    while(cnt) putchar(num[cnt--]);
    putchar(ch);
}
inline ll ksm(int a,int k){
    if (!k) return 1;
    if (!(k^1)) return a;
    ll t=ksm(a,k>>1)%n;
    t*=t;t%=n;
    if (k&1) t*=a;
    t%=n;
    return t;
}
int main(){
    n=in(),m=in(),k=in(),x=in();
    print((ksm(10,k)*m%n+x)%n,\n);
}

D1T2:火柴排队

题意:将一个数组中元素进行几次交换后使得这个数组的大小顺序与另一个数组相同。

解题思路:离散后排序求逆序对数。

#include<stdio.h>
#include<algorithm>
#define ll long long
#define For(i,a,b) for(int i=a; i<=b; i++)
#define Ford(i,a,b) for(int i=a; i>=b; i--)
#define File(fn) freopen(fn".in","r",stdin);freopen(fn".out","w",stdout);
#define mod 99999997
using namespace std;
struct zxy{
    int num,no;
}a[100001],b[100001];
int n,ans=0,c[100001],BIT[100001];
inline int in(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<0||ch>9) f=ch==-?-1:1,ch=getchar();
    while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return x*f;
}
inline void print(int x,char ch){
    if (!x){
        putchar(0);
        putchar(ch);
        return;
    }
    if (x<0){
        putchar(-);
        x*=-1;
    }
    char num[10];
    short cnt=0;
    while(x) num[++cnt]=x%10+0,x/=10;
    while(cnt) putchar(num[cnt--]);
    putchar(ch);
}
bool cmp(zxy a,zxy b){
    return a.num<b.num;
}
void init(){
    n=in();
    For(i,1,n) a[i].num=in(),a[i].no=i;
    For(i,1,n) b[i].num=in(),b[i].no=i;
    sort(a+1,a+n+1,cmp);
    sort(b+1,b+n+1,cmp);
    For(i,1,n) c[b[i].no]=a[i].no;
}
inline int lowbit(int k){
    return k&(-k);
}
inline void update(int x,int ad){
    while(x<=n){
        BIT[x]+=ad;
        x+=lowbit(x);
    }
}
inline int query(int x){
    int sum=0;
    while(x){
        sum+=BIT[x];
        x-=lowbit(x);
    }
    return sum;
}
void solve(){
    For(i,1,n){
        update(c[i],1);
        ans+=(i-query(c[i]));
        ans%=mod;
    }
    print(ans,\n);
}
int main(){
    init();
    solve();
    return 0;
}

 

【NOIP2013TG】solution