zoukankan      html  css  js  c++  java
  • 多校 4 (8/1) 我写的题的题解

    原谅自己迟到的有点厉害

    感觉打的还行,一个一血(K)

    主代码手写的真累...

    B题

    诡异的思路..

    C(n,m) = C(n-1,m-1) + C(n-1,m)

    我们递归2层,我们可以发现

    C(n,0) + C(n,1) + ... + C(n,m)

    = 4 * (C(n-2,0) + C(n-2,1) + ... + C(n-2,m-2)) + 3 * C(n-2,m-1) + C(n-2,m)

    我们发现递归x层,前面的部分都是2的x次方,后面x项不定

    开始打表,每200个打一次表,记录答案

    然后如果m<=200就暴力,m>200就递归下去,到一个200的倍数层

    例如500就递归到400,也就是递归100层

    我们最后100前面的权值可以手算

    当然它的值实际上就是C(100,0) + C(100,1) + ... 这么计算的

    所以预处理一下也就可以了

    D题

    题目出错了(2次)不多吐槽...

    巨慢的通过时间,巨大罚时

    a=1,直接把b排序 选前若干个

    然后看是否比它们乘起来要大就行

    E题

    烦死人的讨论...

    noname提供了一发做法..

    具体的来说把这个矩形翻成一个大三角形(大概长这样)

      1

     2 3

    4 5 6

    ....

    然后就是在这个大三角形里面每次找个斜的平行四边形去更新答案

    平行四边形 = 上三角 + 中间的平行四边形 + 下三角

    然后分别求...

    G题

    lyc写的

    J题

    数独.....

    看上去4^16*16复杂度,但是由于它是数独实际上跑得飞快...

    15ms过

    K题

    如果前面是一个数字0,那么后面一定要一个符号

    如果前面是个符号,后面需要一个数字0或者一个1~9带头的数字

    如果前面是0,问号当加号用

    不然问号当1用即可

    L题

    直接从1到n是最优的

    理由不知道....

    =================

    B

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<time.h>
    #include<math.h>
    #include<memory>
    #include<vector>
    #include<bitset>
    #include<fstream>
    #include<stdio.h>
    #include<utility>
    #include<sstream>
    #include<string.h>
    #include<iostream>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    int fact[100005];
    int anti_fact[100005];
    const int modo=1000000007;
    int power(int x,int y)
    {
        if (y==0) return 1;
        int t=power(x,y/2);
        t=(long long)t*t%modo;
        if (y%2==1)
        {
            t=(long long)t*x%modo;
        }
        return t;
    }
    int val[505][100005];
    int temp[205][205];
    int c(int n,int m)
    {
        if (m>n) return 0;
        return fact[n]*(long long)anti_fact[m]%modo*anti_fact[n-m]%modo;
    }
    int main()
    {
        int i;
        fact[0]=1;
        for (i=1;i<=100000;i++)
        {
            fact[i]=(long long)fact[i-1]*i%modo;
        }
        anti_fact[0]=1;
        for (i=1;i<=100000;i++)
        {
            anti_fact[i]=power(fact[i],modo-2);
        }
        for (i=0;i<=100000;i+=200)
        {
            int j;
            for (j=0;j<=100000;j++)
            {
                val[i/200][j]=c(i,j);
                if (j!=0)
                {
                    val[i/200][j]+=val[i/200][j-1];
                    if (val[i/200][j]>=modo) val[i/200][j]-=modo;
                }
            }
        }
        for (i=0;i<=200;i++)
        {
            int j;
            for (j=0;j<=200;j++)
            {
                temp[i][j]=c(i,j);
                if (j!=0)
                {
                    temp[i][j]+=temp[i][j-1];
                    if (temp[i][j]>=modo) temp[i][j]-=modo;
                }
            }
        }
        int t;
        scanf("%d",&t);
        int zu;
        for (zu=0;zu<t;zu++)
        {
            int n,m;
            scanf("%d%d",&n,&m);
            if (m<=200)
            {
                int sum=0;
                for (i=0;i<=m;i++)
                {
                    sum+=c(n,i);
                    if (sum>=modo) sum-=modo;
                }
                printf("%d
    ",sum);
            }
            else
            {
                int k=n%200;
                int sum=(long long)val[n/200][m-k]*power(2,k)%modo;
                int i;
                n-=k;
                int p=1;
                for (i=0;i<k;i++)
                {
                    sum=(sum+(long long)c(n,m)*temp[k][i])%modo;
                    m--;
                    p*=2;
                    if (p>=modo) p-=modo;
                }
                printf("%d
    ",sum);
            }
        }
        return 0;
    }
    

    D

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<time.h>
    #include<math.h>
    #include<memory>
    #include<vector>
    #include<bitset>
    #include<fstream>
    #include<stdio.h>
    #include<utility>
    #include<sstream>
    #include<string.h>
    #include<iostream>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    int b[105];
    int main()
    {
        int t;
        scanf("%d",&t);
        int zu;
        for (zu=0;zu<t;zu++)
        {
            int n,m;
            scanf("%d%d",&n,&m);
            int i;
            for (i=0;i<n;i++)
            {
                scanf("%d",&b[i]);
                scanf("%d",&b[i]);
            }
            sort(b,b+n);
            for (i=0;i<n;i++)
            {
                m/=(b[i]+1);
                if (m==0) break;
            }
            printf("%d
    ",i);
        }
        return 0;
    }
    

    E

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<time.h>
    #include<math.h>
    #include<memory>
    #include<vector>
    #include<bitset>
    #include<fstream>
    #include<stdio.h>
    #include<utility>
    #include<sstream>
    #include<string.h>
    #include<iostream>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    int l;
    int a[1005];
    long long ans=0;
    int L2;
    int L;
    long long getpos(long long x, long long y)
    {
    	return x * (x + 1) / 2 + y;
    }
    long long sum(long long x, long long y, long long h, long long w, int tag)
    {
    	long long ret = 0, l, r, nowsum;
    	if (!tag)
    	{
    		h = h - x + 1;
    		w = w - y + 1;
    		for (int i = 0; i < L2; i++)
    		{
    			l = getpos(x + i, y);
    			r = getpos(x + i, y + w - 1);
    			nowsum = 0;
    			for (int j = 0; j < L; j++) nowsum += a[j] * ((r - j + L) / L - (l - 1 - j + L) / L);
    			ret += nowsum * ((h - i - 1 + L2) / L2);
    		}
    	}
    	else
    	{
    		h = h - x + 1;
    		w = w - y - h + 2;
    		for (int i = 0; i < L2; i++)
    		{
    			l = getpos(x + i, y + i);
    			r = getpos(x + i, y + i + w - 1);
    			nowsum = 0;
    			for (int j = 0; j < L; j++) nowsum += a[j] * ((r - j + L) / L - (l - 1 - j + L) / L);
    			ret += nowsum * ((h - i - 1 + L2) / L2);
    		}
    	}
    	return ret;
    }
    long long get_res(int x,int y)
    {
        return a[((long long)x*(x+1)/2+y)%l];
    }
    long long calc_line(int x,int y1,int y2)
    {
        if (y1>y2)
        {
            printf("gg
    ");
        }
    	long long l = getpos(x , y1);
    	long long r = getpos(x , y2);
    	long long nowsum = 0;
    	for (int j = 0; j < L; j++) nowsum += a[j] * ((r - j + L) / L - (l - 1 - j + L) / L);
    	return nowsum;
    }
    long long calc_small_tri(int x,int y,int k,int d)
    {
        long long ans=0;
        int i;
        for (i=0;i<k;i++)
        {
            if (d==1)
            {
                ans+=calc_line(x,y,y+i);
            }
            else
            {
                ans+=calc_line(x,y-i,y);
            }
            x+=d;
        }
        return ans;
    }
    void calc_tri(int x,int y,int k,int d)
    {
        if (k%(2*l)==0)
        {
            ans+=(long long)calc_small_tri(x,y,2*l,d)*(k/(2*l));
            if (d==1)
            {
                ans+=sum(x+2*l,y,x+4*l-1,y+2*l-1,0)*(long long)(k/(2*l))*((k/(2*l))-1)/2;
            }
            else
            {
                ans+=sum(x-4*l+1,y-2*l+1,x-2*l,y,0)*(long long)(k/(2*l))*((k/(2*l))-1)/2;
            }
            return;
        }
        else
        {
            k--;
            if (d==1)
            {
                ans+=calc_line(x+k,y,y+k);
            }
            else
            {
                ans+=calc_line(x-k,y-k,y);
            }
            calc_tri(x,y,k,d);
            return;
        }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        int zu;
        for (zu=0;zu<t;zu++)
        {
            scanf("%d",&l);
            L2=l*2;
            L=l;
            int i;
            for (i=0;i<l;i++)
            {
                scanf("%d",&a[i]);
            }
            int q;
            scanf("%d",&q);
            for (i=0;i<q;i++)
            {
                int x1,y1,x2,y2;
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                int len1=x2-x1+1;
                int len2=y2-y1+1;
                x1+=y1;
                y1=x1-y1;
                x2+=y2;
                y2=x2-y2;
                int k=min(len1,len2);
                k--;
                ans=0;
                calc_tri(x1,y1,k,1);
                calc_tri(x2,y2,k,-1);
                x1+=k;
                x2-=k;
                int tag;
                if (len1>len2)
                {
                    tag=1;
                }
                else
                {
                    tag=0;
                }
                ans+=sum(x1,y1,x2,y2,tag);
                cout<<ans<<'
    ';
            }
        }
        return 0;
    }
    

    J

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<time.h>
    #include<math.h>
    #include<memory>
    #include<vector>
    #include<bitset>
    #include<fstream>
    #include<stdio.h>
    #include<utility>
    #include<sstream>
    #include<string.h>
    #include<iostream>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    #define rotate asdi021jdcoaise021jl
    char c[25][25];
    int a[25][25];
    int vis_line[25][25];
    int vis_col[25][25];
    int rotate[5][5];
    int ans=10000;
    void get_rotate(int x,int y)
    {
        static int b[5][5];
        int i;
        for (i=0;i<4;i++)
        {
            int j;
            for (j=0;j<4;j++)
            {
                b[i][j]=a[i+x*4][j+y*4];
            }
        }
        for (i=0;i<4;i++)
        {
            int j;
            for (j=0;j<4;j++)
            {
                a[j+x*4][3-i+y*4]=b[i][j];
            }
        }
    }
    bool check_valid(int x,int y)
    {
        int i,j;
        for (i=x*4;i<x*4+4;i++)
        {
            for (j=y*4;j<y*4+4;j++)
            {
                if (vis_line[i][a[i][j]])
                {
                    return false;
                }
                if (vis_col[j][a[i][j]])
                {
                    return false;
                }
            }
        }
        return true;
    }
    void get_valid(int x,int y,int c)
    {
        int i,j;
        for (i=x*4;i<x*4+4;i++)
        {
            for (j=y*4;j<y*4+4;j++)
            {
                vis_line[i][a[i][j]]+=c;
                vis_col[j][a[i][j]]+=c;
            }
        }
    }
    void dfs(int x,int y)
    {
        if (y==4)
        {
            dfs(x+1,0);
            return;
        }
        if (x==4)
        {
            int i,j;
            int k;
                int sum=0;
                for (i=0;i<4;i++)
                {
                    for (j=0;j<4;j++)
                    {
                        sum+=(rotate[i][j])%4;
                    }
                }
                ans=min(ans,sum);
            return;
        }
        rotate[x][y]=0;
        int k;
        for (k=0;k<4;k++)
        {
            if (check_valid(x,y))
            {
                get_valid(x,y,1);
                dfs(x,y+1);
                get_valid(x,y,-1);
            }
            get_rotate(x,y);
            rotate[x][y]++;
        }
    }
    void find_solution()
    {
        rotate[0][0]=0;
        /*get_valid(0,0,1);
        dfs(0,1);
        get_valid(0,0,-1);
        */
        dfs(0,0);
    }
    int main()
    {
        #ifdef absi2011
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        #endif
        int t;
        scanf("%d",&t);
        int zu;
        for (zu=0;zu<t;zu++)
        {
            int i;
            for (i=0;i<16;i++)
            {
                scanf("%s",c[i]);
            }
            int j;
            for (i=0;i<16;i++)
            {
                for (j=0;j<16;j++)
                {
                    if (c[i][j]<='9')
                    {
                        a[i][j]=c[i][j]-'0';
                    }
                    else
                    {
                        a[i][j]=c[i][j]-'A'+10;
                    }
                }
            }
            ans=10000;
            find_solution();
            printf("%d
    ",ans);
        }
        return 0;
    }
    

    K

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<time.h>
    #include<math.h>
    #include<memory>
    #include<vector>
    #include<bitset>
    #include<fstream>
    #include<stdio.h>
    #include<utility>
    #include<sstream>
    #include<string.h>
    #include<iostream>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    char a[505];
    void fail()
    {
        puts("IMPOSSIBLE");
    }
    void try_ans()
    {
        int n=strlen(a);
        int i;
        int num=-1;
        for (i=0;i<n;i++)
        {
            if (a[i]=='0')
            {
                if (num==-1)
                {
                    num=0;
                }
                else if (num==0)
                {
                    fail();
                    return;
                }
            }
            else if ((a[i]=='+')||(a[i]=='*'))
            {
                if (num==-1)
                {
                    fail();
                    return;
                }
                num=-1;
            }
            else if (a[i]=='?')
            {
                if (num==0)
                {
                    a[i]='+';
                    num=-1;
                }
                else
                {
                    a[i]='1';
                    num=1;
                }
            }
            else
            {
                if (num!=0)
                {
                    num=1;
                }
                else
                {
                    fail();
                    return;
                }
            }
        }
        if (num==-1)
        {
            fail();
            return;
        }
        printf("%s
    ",a);
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        int i;
        for (i=0;i<t;i++)
        {
            scanf("%s",a);
            try_ans();
        }
        return 0;
    } 
    

    L

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<time.h>
    #include<math.h>
    #include<memory>
    #include<vector>
    #include<bitset>
    #include<fstream>
    #include<stdio.h>
    #include<utility>
    #include<sstream>
    #include<string.h>
    #include<iostream>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int t;
        scanf("%d",&t);
        int zu;
        for (zu=0;zu<t;zu++)
        {
            int n;
            scanf("%d",&n);
            int i;
            int p;
            for (i=0;i<n;i++)
            {
                int x;
                scanf("%d",&x);
                if (i==0)
                {
                    p=x;
                }
                if (i==n-1)
                {
                    p-=x;
                }
            }
            printf("%d
    ",(int)sqrt(abs(p)));
        }
        return 0;
    }
    

      

  • 相关阅读:
    【ProjectT】Tapestry
    【ProjectT】Tapestry • Quick Start • Hello World
    【ProjectT】《Pragmatic Version Control Using CVS》【Chapter 2】
    【Notes】《Thinking in Java》【Chapter 11】Part II
    【ProjectT】《Pragmatic Version Control Using CVS》【Chapter 1】
    【ProjectT】Tapestry • Quick Start • DirectLink
    【ProjectT】Pragmatic Version Control Using CVS
    【Notes】《Thinking in Java》【Chapter 11】
    【ProjectT】Tapestry • Quick Start • Forms
    【ProjectT】Tapestry • Quick Start • Introduction
  • 原文地址:https://www.cnblogs.com/absi2011/p/9427938.html
Copyright © 2011-2022 走看看