[测试题]神在夏至祭降下了神谕(oracle)

Description

我们村子在过去的 400 年中, 断绝与下界的接触, 过着自给自足的生活。
夏至祭是一场迎接祖灵于夏季归来, 同时祈求丰收的庆典。
村里的男人会在广场上演出夏之军和冬之军的战争。 夏之军会打倒冬之军的大将冬男, 再放火将他连山车一起烧掉。
参与这场演出的一共有 N+M 位战士, 其中 N 个人是冬之军, M 个人是夏之军。
冬之军的大将冬男拥有改变季节的力量。 他每次可以任意选取恰好 K 名战士, 然后把这 K 个人中所有的夏之军变成冬之军, 所有的冬之军变成夏之军。
冬男可以使用任意多次改变季节的力量, 直到他将所有的人都变成了冬之军。
如果冬男将所有的人都变成了冬之军, 那么冬男就获得了胜利。
我想要知道, 对于给定的 N,M,K, 冬男是否有可能获得胜利。
神有时会降下神谕, 帮助你作出判断。

Input

第一行包括一个正整数 year, 表示进行夏至祭的年份。
第二行包括一个正整数 T, 表示数据的组数。
接下来 T 行, 每行三个非负整数 N,M,K, 每一行表示一组数据。 输入数据保证 K>0

Output

T 行, 每行为一个字符串“Case x: S” , 不包含引号。
x 表示当前为第 x 组数据, 从 1 开始编号,
若冬男有可能获得胜利, S Winter, 否则 S Summer

Sample Input

1924
9 2
0 3
2 1 4
2 6 3
100 5 12
7 6 10
6 6 10
1000000000000000000 1 2
500000000 500000000 987654321
1000000000 1000000000 987654321

Sample Output

Case 1: Winter
Case 2: Summer
Case 3: Winter
Case 4: Summer
Case 5: Winter
Case 6: Winter
Case 7: Summer
Case 8: Winter
Case 9: Winter

Hint

 

神谕 2M 是奇数。
神谕 3K 是奇数。
√表示对于这个测试点的所有 T 组数据, 神降下了神谕。
×表示对于这个测试点的所有 T 组数据, 神否定了神谕。
也就是说, 若神谕为“X 是奇数” , 则×表示“X 是偶数” 。
所有数据保证 K>0
请注意特判 M=0N+M<K 等特殊情况, 读入时请使用 long long int64

题解

我们先不妨将$m=m%k$,

那么为了有解,我们要将$m$加个数或者减个数,使得其模$k$为$0$,

我们假设有$x$个从$n$变成$m$,$y$个从$m$变成$n$。

那么就有

$$(m+x-y=k||m-x+y=0)&&x+y=k$$

那么只要解这两个方程组,判断有无整数解即可。

其实化简后就是判断$m$和$k$的奇偶性。

复制代码
 1 #include<set>
 2 #include<map>
 3 #include<cmath>
 4 #include<ctime>
 5 #include<queue>
 6 #include<stack>
 7 #include<vector>
 8 #include<cstdio>
 9 #include<string>
10 #include<cstring>
11 #include<cstdlib>
12 #include<iostream>
13 #include<algorithm>
14 #define LL long long
15 using namespace std;
16 
17 int year,t;
18 LL n,m,k,rk;
19 
20 int main()
21 {
22     scanf("%d%d",&year,&t);
23     for (int ca=1;ca<=t;ca++)
24     {
25         printf("Case %d: ",ca);
26         scanf("%lld%lld%lld",&n,&m,&k);
27         if (m%k==0) printf("Winter\n");
28         else if (m+n<k) printf("Summer\n");
29         else if (m+n==k&&m!=0) printf("Summer\n");
30         else
31         {
32             if (k%2) rk=1;
33             else rk=2;
34             if (k>m&&(k-m)%rk==0) printf("Winter\n");
35             else if (k<m&&(m-k)%rk==0) printf("Winter\n");
36             else printf("Summer\n");
37         }
38     }
39     return 0;
40 }
复制代码

 

posted @   NaVi_Awson  阅读(510)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示