2013 多校第四场

来源:互联网 发布:点阵取模软件 编辑:程序博客网 时间:2024/05/22 15:42

今天多校大家都发挥了自己的水平,但是还是有进步的空间哦。

我说下自己写的三道题吧。

1002

其实就是一道裸的波利亚计数定理。

置换方法                       定点循环节          面点循环节        棱的循环节     总计           个数

不动                                  8                          54                    12              74               1

面心-面心(+-90度)          2                          15                     3               20               6

面心-面心(180度)           4                           28                    6               38               3

棱心-棱心(180度)           4                           27                    7               38               6

对角线     (120度)           4                          18                     4               26              8


最后的ans = (1*k^74 + 6*k^20 + 3*k^38 + 6*k^38 + 8*k^26) /24

CODE:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)#define oo (1<<30)#define eps 1e-6#define nMax 100010#define MOD 10007#define LL long longLL EXP(LL a,int n){    if(n==0) return 1LL;    LL k=EXP(a,n/2);    k =k*k%MOD;    if(n&1) k = k*a%MOD;    return k;}int c[]={74,20,38,38,26};LL b[]={1,6,3,6,8};LL k;int main(){#ifndef ONLINE_JUDGE    //freopen("input.txt","r",stdin);#endif    int t,cas=1;    scanf("%d",&t);    while(t--){        scanf("%I64d",&k);        LL ans=0;        for(int i= 0;i<5;i++) ans = (ans+EXP(k,c[i])*b[i])%MOD;        ans = (ans*417)%MOD;        printf("Case %d: %I64d\n",cas,ans);        cas++;    }    return 0;}

1007

典型的树状数组的应用。

把询问保存按l排序。

维护的树状数组是可以直接求出ans的。

具体的方法请看代码。

CODE:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)#define oo (1<<30)#define eps 1e-6#define nMax 100010int a[nMax],f[nMax],tp[nMax];int n,m;int c[nMax],vis[nMax];int lowbit(int x) { return x&(-x);}int sum(int x){    int sum=0;    while(x>0){        sum += c[x];        x -= lowbit(x);    }    return sum;}int add(int x,int ad) {    f[x]+=ad;    while(x<=n) {        c[x] += ad;        x += lowbit(x);    }    return 0;}void ins(int p,int k){    if(k==0) {        if(tp[a[p]+1]<p && vis[a[p]+1]==0){            add(p,-f[p]);        }else {            add(p,1-f[p]);        }    }else {        if(tp[a[p]-1]<p && vis[a[p]-1]==0){            add(p,-f[p]);        }else {            add(p,1-f[p]);        }    }    //vis[a[p]]=0;}struct qu{    int l,r,id;    void read(){        scanf("%d%d",&l,&r);    }    friend bool operator < (const qu& u,const qu& v) {        if(u.l==v.l) return u.r<v.r;        return u.l<v.l;    }};qu q[nMax];int ans[nMax];int main(){#ifndef ONLINE_JUDGE    freopen("input.txt","r",stdin);#endif    int t;    scanf("%d",&t);    while(t--){        scanf("%d%d",&n,&m);        FOR(i,1,n) scanf("%d",&a[i]);        FOR(i,1,n) tp[a[i]]=i;tp[0]=tp[n+1]=n+1;        memset(c,0,sizeof(c));        memset(f,0,sizeof(f));        FOR(i,1,n) vis[i]=0;vis[0]=vis[n+1]=0;        for(int i=1;i<=n;i++) {            if(vis[a[i]+1]&&vis[a[i]-1]) add(i,-1);            if(!vis[a[i]+1]&&!vis[a[i]-1]) add(i,1);            vis[a[i]]=1;        }        FOR(i,1,n) vis[i]=0;        FOR(i,1,m) q[i].read(),q[i].id=i;        sort(q+1,q+m+1);        int top=1;        //FOR(j,1,n) printf("--%d ",f[j]);printf("\n");        FOR(i,1,m) {            while(q[i].l>top)  {                vis[a[top]]=1;                int b=a[top]+1;                if(b<=n && vis[b]==0) ins(tp[b],0);                b=a[top]-1;                if(b>=1 && vis[b]==0) ins(tp[b],1);                add(top,-f[top]);top++;                //FOR(j,1,n) printf("%d ",f[j]);printf("\n");            }            ans[q[i].id]=sum(q[i].r);        }        FOR(i,1,m) printf("%d\n",ans[i]);    }    return 0;}

1008

这种签到题就木有必要说什么了。

CODE:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<map>using namespace std;#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)#define oo (1<<30)#define eps 1e-6#define nMax 100010#define MOD 10007#define LL long longchar s[nMax];int n;LL f[nMax];void init(){    f[1]=1;f[2]=2;    for(int i=3;i<=10086;i++) f[i]=(f[i-1]+f[i-2])%MOD;}LL EXP(LL a,LL n){    if(n==0) return 1LL;    LL k=EXP(a,n/2);    k=k*k%MOD;    if(n&1) k=k*a%MOD;    return k;}map<int,int> h;//#define bug puts("hehe");int main(){#ifndef ONLINE_JUDGE    freopen("input.txt","r",stdin);#endif    init();    int t,cas=1;    scanf("%d",&t);    while(t--){        scanf("%s",s);        n = strlen(s);        h.clear();        for(int i=0;i<n;){            int j=i;            if(s[j]=='h' && j+1<n && s[j+1]=='e'){                int sum=0;                while(j<n){                    if(s[j]=='h' && j+1<n && s[j+1]=='e') sum+=1,j+=2;                    else break;                }                if(sum>=2) h[sum]++;            }else j++;            i=j;        }        LL ans=1LL;        map<int,int>::iterator iter;        for(iter=h.begin();iter!=h.end();iter++){            LL add = EXP(f[(*iter).first],(*iter).second);            ans = (ans*add)%MOD;        }        printf("Case %d: %I64d\n",cas,ans);        cas++;    }    return 0;}


原创粉丝点击