NOIP 2012

发布时间:2025-12-09 12:01:08 浏览次数:2

Vigenère密码

题目
模拟。

#include <iostream>using namespace std;int main(){    string k,c;    cin>>k>>c;    for (int i=0;i<c.length();i++) {        int t=(k[i%k.length()]&31)-1;        c[i]=(c[i]&31)-t>0?c[i]-t:c[i]-t+26;    }    cout<<c<<endl;    return 0;}

国王游戏

题目
按\(a_ib_i\)升序排序,证明采用邻项交换法即可。
垃圾出题人要我写高精。

#include<bits/stdc++.h>using namespace std;struct BIGNUM{    int a[100001];    BIGNUM()    {        memset(a,0,100001),a[0]=1;    }    BIGNUM operator=(string s)    {        a[0]=s.length();        for(int i=1;i<=a[0];i++)            a[i]=s[a[0]-i]-'0';        return *this;    }    BIGNUM operator=(int n)    {        char x[100001];        string s;        sprintf(x,"%d",n);        s=x;        *this=s;        return *this;    }    BIGNUM (int n)    {        *this=n;    }    BIGNUM (string s)    {        *this=s;    }    BIGNUM operator*(BIGNUM b)    {        BIGNUM c;        for(int i=1;i<=a[0];i++)            for(int j=1;j<=b.a[0];j++)                c.a[i+j-1]+=a[i]*b.a[j],c.a[i+j]+=c.a[i+j-1]/10,c.a[i+j-1]%=10;        c.a[0]=a[0]+b.a[0]-1;        if(c.a[c.a[0]+1])            c.a[0]++;        return c;    }    BIGNUM operator/(int x)    {        BIGNUM b;        b.a[0]=a[0];        int tmp=0;        for (int i=a[0];i;i--)         {            tmp=tmp*10+a[i];            b.a[i]=tmp/x;            tmp%=x;        }        while(!b.a[b.a[0]]&&b.a[0]>1)            b.a[0]--;         return b;    }    bool operator<(BIGNUM b)    {        if(a[0]!=b.a[0])            return a[0]<b.a[0];        for(int i=a[0];i;i--)            if(a[i]!=b.a[i])                return a[i]<b.a[i];        return false;    }};ostream& operator <<(ostream &out,BIGNUM &x){    for(int i=x.a[0];i;i--)        cout<<x.a[i];    return out;}struct Lovelive{    int x,y;    long long z;}a[100001];bool cmp(Lovelive a,Lovelive b){    return a.z<b.z;}int n;int main(){    scanf("%d",&n);    for(int i=0;i<=n;i++)        scanf("%d%d",&a[i].x,&a[i].y),a[i].z=a[i].x*a[i].y;    sort(a+1,a+n+1,cmp);    BIGNUM ans=1,tmp,k=1;    for(int i=1;i<=n;i++)    {        k=k*a[i-1].x;        tmp=k/a[i].y;        ans=ans<tmp? tmp:ans;    }    cout<<ans;    return 0;}

同余方程

题目
exgcd。
注意exgcd求的是绝对值最小的解。

#include<bits/stdc++.h>using namespace std;int a,b,x,y,k;void exgcd(int a,int b){!b? (x=1,y=0):(exgcd(b,a%b),k=x,x=y,y=k-a/b*y);}int main(){cin>>a>>b,exgcd(a,b),cout<<(x+b)%b;}
noip2012
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477