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

 

转载于:https://www.cnblogs.com/violet-acmer/p/9739090.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值