2013多校7

来源:互联网 发布:电脑软件开发 编辑:程序博客网 时间:2024/05/18 02:59
1001 貌似大家都会做吧。。
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<vector>#include<set>#include<queue>#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 CLR(a) memset((a),0,sizeof((a)))#define pb push_back#define mp make_pair#define ins insert#define bug puts("Oh Here!");#define nMax 60010#define oo 0x7fffffff#define eps 1e-8#define LL long long#define Vec vector<int>#define Pai pair<int,int>multiset<int> s[1<<7];multiset<int>::iterator it;int p[nMax][7];int n,k;void Del(int id){    int sum=0;    for(int i=0;i<(1<<k);i++) {        sum=0;        for(int j=0;j<k;j++) if(i&(1<<j)) sum+=p[id][j+1]; else sum-=p[id][j+1];        it = s[i].find(sum);        s[i].erase(it);    }}void Ins(int id){    int sum=0;    for(int i=0;i<(1<<k);i++) {        sum=0;        for(int j=0;j<k;j++) if(i&(1<<j)) sum+=p[id][j+1]; else sum-=p[id][j+1];        s[i].ins(sum);    }}int Que(){    int sum=0;    for(int i=0;i<(1<<k);i++) if(s[i].size()>1){        it=s[i].end();it--;        sum = max(sum,*(it)-*(s[i].begin()));    }    return sum;}int main(){#ifndef ONLINE_JUDGE//    freopen("input.txt","r",stdin);#endif    //s[0].clear();    //s[0].ins(2);s[0].ins(2);it=s[0].find(2);s[0].erase(2);printf("%d\n",s[0].size());    while(~scanf("%d%d",&n,&k)){        for(int i=0;i<(1<<k);i++) s[i].clear();        for(int i=1;i<=n;i++) {            scanf("%d",&p[i][0]);            if(p[i][0]==0) {                for(int j=1;j<=k;j++) scanf("%d",&p[i][j]);                Ins(i);            }else {                scanf("%d",&p[i][1]);                Del(p[i][1]);            }            printf("%d\n",Que());        }    }    return 0;}

1010. 组合计数。。小心推导就是。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<vector>#include<set>#include<queue>#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 CLR(a) memset((a),0,sizeof((a)))#define pb push_back#define mp make_pair#define bug puts("Oh Here!");#define nMax 300010#define oo 0x7fffffff#define eps 1e-8#define MOD 1000000007#define LL long long#define Vec vector<int>#define Pai pair<int,int>int s[nMax];LL ni[nMax],jie[nMax];LL EXP(int a,int n){    if(a<0) return 0LL;    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 gcd(int a,int b,LL &x,LL &y){    if(b==0) {x=1LL,y=0LL;return a;}    int r=gcd(b,a%b,y,x);    y-=x*(a/b);    return r;}LL Ni(int a){    LL x,y;    int d=gcd(a,MOD,x,y);    x=(x%MOD+MOD)%MOD;    return x;}void init(){    jie[0]=1LL;    for(int i=1;i<nMax;i++) jie[i]=(jie[i-1]*i)%MOD;    for(int i=0;i<nMax;i++) ni[i]=Ni(jie[i]);}LL ans[nMax],add;int n,m,k,a;int t,sum;int main(){#ifndef ONLINE_JUDGE//    freopen("input.txt","r",stdin);#endif    init();    //for(int i=0;i<10;i++) printf("%I64d ",ni[i]);    while(~scanf("%d%d%d",&n,&m,&k)){        FOR(i,0,m) s[i]=0;        for(int i=0;i<n;i++) scanf("%d",&a) , s[a]++;        for(int i=m;i>=1;i--){            //if(i!=1) printf(" ");            sum=0;            for(int j=1;j*i<=m;j++) sum += s[j*i];            if(n-sum > k) {                //printf("%d",0);                ans[i]=0LL;                continue;            }            t=n-sum;            //printf("i=%d t=%d sum=%d ",i,t,sum);            ans[i] = EXP(m/i,t);            ans[i] = (((ans[i]*jie[sum]%MOD)*ni[k-t]%MOD)*ni[sum-k+t]%MOD)*EXP(m/i-1,k-t)%MOD;            t+=s[i];sum-=s[i];            //printf("%I64d ",ans);            //printf("t=%d sum=%d ",t,sum);            for(int j=2;j*i<=m;j++) ans[i] = (ans[i]-ans[i*j])%MOD;            /*if(t>k) add=0LL;            else {                add = (((EXP(m/i-1,t)*jie[sum]%MOD)*ni[k-t]%MOD)*ni[sum-k+t]%MOD)*EXP(m/i-2,k-t)%MOD;            }            printf("%I64d\n",add);            ans -= add;            ans = (ans%MOD+MOD)%MOD;            printf("%I64d",ans);*/            ans[i] = (ans[i]%MOD+MOD)%MOD;        }        for(int i=1;i<=m;i++) {            if(i!=1) printf(" ");            printf("%I64d",ans[i]);        }        printf("\n");    }    return 0;}


原创粉丝点击