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/p 块,然后一块一块填。

    ②反之,将 m 分成 m/p 块,然后一块一块填。

  注意输出格式。

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n,m,p;
 8     scanf("%d%d%d",&n,&m,&p);
 9     if(n*m%p != 0)
10     {
11         printf("No\n");
12         return 0;
13     }
14     int res[110][110];
15     int peo=1;
16     if(n%p == 0)
17     {
18         for(int i=1;i <= m;++i)
19         {
20             for(int j=1;j <= n;++j)
21             {
22                 res[j][i]=peo;
23                 if(j%p == 0)
24                     peo++;
25             }
26         }
27     }
28     else
29     {
30         for(int i=1;i <= n;++i)
31         {
32             for(int j=1;j <= m;++j)
33             {
34                 res[i][j]=peo;
35                 if(j%p == 0)
36                     peo++;
37             }
38         }
39     }
40     printf("Yes\n");
41     for(int i=1;i <= n;++i)
42     {
43         for(int j=1;j <= m;++j)
44         {
45             if(j != 1)
46                 cout<<' ';
47             cout<<res[i][j];
48         }
49         cout<<endl;
50     }
51 }
View Code

 

posted @ 2018-10-03 07:52  HHHyacinth  阅读(247)  评论(0编辑  收藏  举报