码迷,mamicode.com
首页 > 其他好文 > 详细

【NOIP2013TG】solution

时间:2017-03-14 12:05:27      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:owb   circle   顺序   void   sum   amp   pac   upd   str   

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

标签:owb   circle   顺序   void   sum   amp   pac   upd   str   

原文地址:http://www.cnblogs.com/Melacau/p/6547680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!