EOJ2018.10 月赛(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 }