您的位置:首页 > 其它

Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field 推规律+证明

2017-11-22 22:51 441 查看
题意:

略;

 这个题我是没推出来,想了好久也没想明白,看了题解才会做的,而且我对这个题的想法跟题解一点关系都没有,也就是说思路根本不存在;

那就证明一下这个题的正确性吧

理解:

首先是不存在的这种情况,我们知道,要是 n , m 奇偶性不同,并且 k = -1 是的情况是不存在的

因为: 

假设 n 为偶数,m 为奇数,对于每一行合法的话,那么每一行有且只能有奇数个-1,那么-1的总个数就是 n*(奇数)= 偶数;

再看每一列都合法的话,每一列有奇数个-1,那么-1的总个数就是 m *(奇数)= 奇数;  显然矛盾,这时候答案为 0;

另一种情况就是,n m 都比较大的时候,这里相当于把矩阵分成4部分:(假设整个矩阵为(1,1)-(n,m))

①(1,1)-(n-1,m-1)这个矩阵,每个位置可以任意放置 1 或者 -1  (其实答案就在这里,答案就是 2^[ (n-1)*(m-1) ] 了 )

②(n,1)- (n,m-1)相当于最后一行除了最右下角的格子,这一行的每个数的放置 受他所在一列上面的 -1 的个数的制约,视情况放置

③(1,m)- (n-1,m)相当于最后一列除了最右下角的格子,这一列的每个数的放置受他所在一行左边的 -1 的个数的制约,视情况放置

④(n,m)这个格子,受②③两部分的同时制约;

那么问题来了,能否确定(n,m)放上数以后使得最后一行 最后一列同时满足条件呢?答案是肯定的;

①② 和 ①③ 组合,分别使得各自组成的矩阵满足条件(可以自己找例子试试),满足当前条件的话,他们的-1的个数的奇偶性就一样,

而他们又有公共的部分①,那么②③的-1 的个数的奇偶性就一样,就能保证上述问题满足

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 100 + 7, maxd = 670000 + 7;
const ll mod = 1e9 + 7;
const int INF = 0x7f7f7f7f;

int main() {
ll n, m, k;
cin >> n >> m >> k;
if( (n+m) % 2 && k == -1 ) return puts("0")*0;
n--, m--;
n %= (mod-1), m %= (mod-1);
n = (n*m);
ll x = 2, ans = 1;
while(n) {
if(n&1) ans
fd99
= (ans*x) % mod;
x = (x*x) % mod;
n /= 2;
}
cout << ans << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: