[群内模拟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。
代码就不贴了吧。
树的处理什么的都是大!丧!题!
本文由qrc出品,若不在本博客上看到,请与本人联系。
网址:http://www.cnblogs.com/qrcer