EOJ2018.10 月赛(A 数学+思维题)

传送门:Problem A

https://www.cnblogs.com/violet-acmer/p/9739115.html

题意:

  能否通过横着排或竖着排将 1x p 的小姐姐填满 n x m 的区域内。

题解:

  只有当 n*m%p == 0 时才有可能填满,又注意到 p 为质数,故如果 n*m%p == 0, 则 n,m只少有一个是 p 的整倍数。

  分两种情况:

  (1)n*m%p != 0 ,输出 No。

  (2)n*m%p == 0

    ①如果 n%p == 0,可以将 n 分成 n/pEOJ2018.10 月赛(A 数学+思维题)EOJ2018.10 月赛(A 数学+思维题)EOJ2018.10 月赛(A 数学+思维题) 块,然后一块一块填。

    ②反之,将 m 分成 m/pEOJ2018.10 月赛(A 数学+思维题)EOJ2018.10 月赛(A 数学+思维题)EOJ2018.10 月赛(A 数学+思维题) 块,然后一块一块填。

  注意输出格式。

AC代码:

 #include<iostream>
#include<cstdio>
using namespace std; int main()
{
int n,m,p;
scanf("%d%d%d",&n,&m,&p);
if(n*m%p != )
{
printf("No\n");
return ;
}
int res[][];
int peo=;
if(n%p == )
{
for(int i=;i <= m;++i)
{
for(int j=;j <= n;++j)
{
res[j][i]=peo;
if(j%p == )
peo++;
}
}
}
else
{
for(int i=;i <= n;++i)
{
for(int j=;j <= m;++j)
{
res[i][j]=peo;
if(j%p == )
peo++;
}
}
}
printf("Yes\n");
for(int i=;i <= n;++i)
{
for(int j=;j <= m;++j)
{
if(j != )
cout<<' ';
cout<<res[i][j];
}
cout<<endl;
}
}
上一篇:INNO SETUP 读取可变注册表路径的问题


下一篇:iOS定时器