欢迎使用CSDN-markdown编辑器

来源:互联网 发布:大数据重塑护理价值 编辑:程序博客网 时间:2024/06/05 14:33

A

polya板子题    
#include <bits/stdc++.h>using namespace std;int N,T;int gcd(int x, int y){    if(y==0) return x;    return gcd(y,x%y);}long long power(int x,int y){    long long p = 1, q = x;    for(; y; y>>=1){        if(y&1) p*=q;        q *= q;    }    return p;}int main(){    while(scanf("%d%d",&N,&T)!=EOF){        long long Ans = 0;        for(int i=1; i<=N; i++)            Ans += power(T,gcd(i,N));        printf("%d ",Ans/N);        if(N&1) Ans += N*power(T,(N+1)/2);        else Ans += N/2*(power(T,(N+2)/2)+power(T,N/2));        printf("%d\n",Ans/N/2);    }}

B

单纯形

F

矩阵快速幂板子题
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int n;struct matrix{    int x,y;    int num[10][10];    friend matrix operator *(const matrix a, const matrix b){        matrix c;c.x=a.x,c.y=b.y;        for(int i=0;i<a.x;i++)            for(int j=0;j<b.y;j++){                int sum=0;                for(int k=0;k<a.y;k++){                    sum=(sum+(long long)a.num[i][k]*b.num[k][j])%n;                    if(sum<0) sum+=n;                }                c.num[i][j]=sum;            }        return c;    }}base;matrix mi(matrix a,long long k){    matrix s;    s.x=s.y=a.x;    memset(s.num,0,sizeof(s.num));    for(int i=0;i<s.x;i++) s.num[i][i]=1;    while(k){        if(k&1) s=s*a;        k=k>>1;        a=a*a;    }    return s;}int main(){    base.x=base.y=6;    int map[6][6]={        {2,1,1,1,0,0},{1,2,1,1,0,0},{1,0,1,0,0,0},{0,1,0,1,0,0},{1,1,1,1,1,0},{2,2,2,2,1,1}    };    for(int i=0;i<6;i++) for(int j=0;j<6;j++) base.num[i][j]=map[i][j];    int x,y,dx,dy;long long t;    scanf("%d%d%d%d%d%lld",&n,&x,&y,&dx,&dy,&t);    matrix tm;    tm.x=1;    tm.y=6;    int tmp[]={x-1,y-1,dx,dy,0,1};    for(int i=0;i<tm.y;i++) tm.num[0][i]=tmp[i];    tm=tm*mi(base,t);    printf("%d %d\n",tm.num[0][0]+1, tm.num[0][1]+1);    return 0;}

H

绝对值求和,拆开扫描即可 ?
#include <bits/stdc++.h>using namespace std;const int MN = 3e5+9;struct node{    long long a; int b,c;}s[MN];bool cmp1(const node &u, const node &v){    return u.a<v.a;}bool cmp2(const node &u, const node &v){    return u.b<v.b;}int N,K;int main(){    scanf("%d",&N);    for(int i=1; i<=N; i++){        scanf("%d",&s[i].a);        s[i].b = i;    }    sort(s+1,s+N+1,cmp1);    scanf("%d",&K);    long long Len = 0, Sum = 0;    for(int i=1; i<=K; i++){        Sum += (i*2-1-K)*s[i].a;        Len += s[i].a;    }    long long Ans = Sum; int St = 0;    for(int i=1; i+K<=N; i++){        Sum -= Len-s[i].a*K;        Len += s[i+K].a-s[i].a;        Sum += s[i+K].a*K-Len;        if(Sum<Ans) Ans = Sum, St = i;    }    for(int i=1; i<=K; i++)        printf("%d ",s[St+i].b);}

I

特判
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int main(){    int v[3],k,u[3];    scanf("%d%d%d%d",&v[0],&v[1],&v[2],&k);    sort(v,v+3);    u[0]=min(k/3,v[0]-1);    u[1]=min((k-u[0])/2,v[1]-1);    u[2]=min(k-u[0]-u[1],v[2]-1);    long long ans=1;    for(int i=0;i<3;i++) ans*=(u[i]+1);    cout<<ans<<endl;    return 0;}

J

单调队列dp ?
#include <bits/stdc++.h>using namespace std;const int MN = 3e5+9;long long f[2][MN];int N,M,B,mono1[MN],mono2[MN],D;struct node{ int a,t; }s[MN];bool cmp(const node &u, const node &v){    return u.t<v.t;}long long calc1(int q,int i,int j,long long T){    i = mono1[i];    if(i+T*D>=j) return f[q][i];        else return f[q][i]+j-i-T*D;}long long calc2(int q,int i,int j,long long T){    i = mono2[i];    if(i-T*D<=j) return f[q][i];        else return f[q][i]+i-T*D-j;}int main(){    scanf("%d%d%d",&N,&M,&D);    long long Sum = 0;    for(int i=1; i<=M; i++){        scanf("%d%d%d",&s[i].a,&B,&s[i].t);        Sum += B;    }    sort(s+1,s+N+1,cmp);    for(int i=1; i<=N; i++)        f[1][i] = abs(i-s[1].a);    for(int i=2; i<=M; i++){        int p = i&1, q = p^1, T = s[i].t-s[i-1].t;        int L1 = 1, R1 = 0, L2 = 1, R2 = 0;        for(int j=1; j<=N; j++){            while(L1<=R1 && f[q][j]<=calc1(q,R1,j,T)) R1--;            mono1[++R1] = j;            while(L1<R1 && calc1(q,L1+1,j,T)<=calc1(q,L1,j,T)) L1++;            f[p][j] = calc1(q,L1,j,T);        }        for(int j=N; j>=1; j--){            while(L2<=R2 && f[q][j]<=calc2(q,R2,j,T)) R2--;            mono2[++R2] = j;            while(L2<R2 && calc2(q,L2,j,T)<=calc2(q,L2+1,j,T)) j++;            f[p][j] = min(f[p][j], calc2(q,L2,j,T));        }    }    long long Ans = f[N&1][1];    for(int i=2; i<=N; i++)        Ans = min(Ans,f[N&1][i]);    printf("%I64d\n", Sum-Ans);}

K

两个互逆置换相乘等于零置换,判断K次以内能不能到达和是否能 mod 2即可
#include <bits/stdc++.h>using namespace std;const int MN = 111;const int D[2][2] = {{0,1},{1,0}};int N,K,s[MN],p[2][MN],q[2][MN],d[MN];int check(int M){    for(int i=1; i<=N; i++)        p[1][i] = i;    for(int i=0; i<M; i++){        int x = i&1; int y = x^1;        for(int j=1; j<=N; j++)            p[x][j] = p[y][q[d[i]][j]];        for(int j=1; j<=N; j++){            if(p[x][j]!=s[j]) break;            if(j==N) return i+1;        }    }    return 0;}int main(){    scanf("%d%d",&N,&K);    for(int i=1; i<=N; i++)        scanf("%d",&q[0][i]);    for(int i=1; i<=N; i++)        q[1][q[0][i]] = i;    for(int i=1; i<=N; i++)        scanf("%d",&s[i]);    for(int i=1; i<=N; i++){        if(s[i]!=i) break;        if(i==N) {printf("NO"); return 0;}    }    for(int i=0; i<MN; i++) d[i] = 0;    int T0 = check(K);    for(int i=0; i<MN; i++) d[i] = 1;    int T1 = check(K);    bool flag = 0;    for(int i=0; i<2; i++){        memcpy(d,D[i],sizeof(D[i]));        flag = flag | (check(2)==0);    }    if(T0>0&&(K-T0)%2==0)        if(K==T0||flag)            {printf("YES"); return 0;}    if(T1>0&&(K-T1)%2==0)        if(K==T1||flag)            {printf("YES"); return 0;}    printf("NO");}
原创粉丝点击