[群内模拟3.25]过生日,方程狂魔,监视

  这一周是clz出题,他的博客:http://www.cnblogs.com/pinkrabbit

  一共是3题,整体难度大约是普及+/提高,三题覆盖了DP、数学和图论的内容。难度排序是T1<T2<T3。

 

  第一题:过生日,要求给定一个01图,求一个最大的正方形覆盖的区域都是0的正方形边长。

  容易看出这就是一个O(nm)的dp,f[i][j]表示以(i,j)为右下角的点的正方形的最大边长。

  对于一个不在左或上边界的点,我们找出它左边和上方的最长0段(扫的时候顺便计算)和左上角的点的最大正方形边长取个min就是它的最大边长。

  本题细节不多,大约普及T4的难度。

  代码如下:

#include<cstdio>
using namespace std;
int n,m,row[3001],lin,dp[2][3001],maxn;
int mn(int x,int y){return x<y?x:y;}
int mx(int x,int y){return x>y?x:y;}
int main()
{
    freopen("birthday.in","r",stdin);
    freopen("birthday.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        lin=0;
        for(int j=1;j<=m;j++)
        {
            char c=getchar();
            while(c!='0'&&c!='1')c=getchar();
            bool a=c=='0'?0:1,k=i&1;
            if(a)lin=j,row[j]=i;
            int sq=mn(i-row[j],j-lin);
            sq=mn(sq,dp[k^1][j-1]+1);
            dp[k][j]=sq;
            maxn=mx(maxn,dp[k][j]);
        }
    }
    maxn>2?printf("%d",maxn):printf("Impossible");
    return 0;
}

 

  第二题:方程狂魔,求的所有正整数对(x,y);

  思路:由题中方程组我们可以通分得到,那么把它分解可得,也就是要计算的正因数个数。

     那么我们根据因数个数公式:进行质因数分解,用筛法处理就做完了(不会线筛的悲哀)。

     赞一下出题人,细节真心少,码起来带劲!


  P.S.1:我在题面中被出题人狠狠地D了一番。。

  P.S.2:公式打得好累。。

  下面贴上代码:

#include<cstdio>
using namespace std;
const long long clz=1000000007;
int n;long long ans=1;
bool prime[10000001];
int main()
{
    freopen("devil.in","r",stdin);
    freopen("devil.out","w",stdout);
    scanf("%d",&n);
    for(int i=2;i<=n;i++)if(!prime[i])
    {
        for(int j=i+i;j<=n;j+=i)prime[j]=1;
        long long m=0;
        for(long long j=i;j<=n;j*=i)m+=n/j;
        ans=(ans*(m*2+1))%clz;
    }
    printf("%d",ans);
    return 0;
}

  第三题 监视

  还记得被NOIP2016的Day1T2的天天爱跑步(running)支配的恐惧吗!完完全全的原题!不过加上了最小生成树建树。

  难度:显然是提高D1T2。

  代码就不贴了吧。

  树的处理什么的都是大!丧!题!

 

posted @ 2017-04-02 23:07  qrc  阅读(295)  评论(0编辑  收藏  举报