多校 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;
}

  

原文地址:https://www.cnblogs.com/absi2011/p/9427938.html