【BZOJ】2172: Mario填格子
题意
\(3 * 3\)的网格,给出左上角的数字\(m\)和右下角的数字\(m\),如果当前格子有数字\(x\),格子左边有个数字\(y\),格子上面有个数字\(z\),则\(y|x, z|x\)。格子中不存在相同的两个数。问是否存在填满格子的方案。
分析
最优放法肯定是每一个格子放的数相是上面和左边的数的最小公倍数或乘上了一个质因子。
首先我们质因子肯定是\(p=m/n\)的质因子(如果\(m \% n \neq 0\)则显然无解)而且可以把左上角看成\(1\),右下角看成\(p\)。
(下面假设\(a, b, c, d\)是\(p\)的质因子,且个数依次递增)
如果\(p\)的质因子种类超过\(3\)种,则显然成立。
$$
\begin{matrix}
1 & a & ad \\
b & ab & abd \\
bc & abc & p \\
\end{matrix}
$$
如果\(p\)的质因子种类只有\(3\)种,\(c\)的个数要超过\(1\)。
$$
\begin{matrix}
1 & c & cc \\
b & bc & bcc \\
ab & abc & p \\
\end{matrix}
$$
如果\(p\)的质因子种类只有\(2\)种,\(a, b\)的个数要超过\(1\)或者\(b\)的个数超过\(4\)种。
$$
\begin{matrix}
1 & a & aa \\
b & ab & aab \\
bb & abb & p \\
\end{matrix}
$$
$$
\begin{matrix}
1 & a & ab \\
b & abb & abbb \\
bb & abbbb & p \\
\end{matrix}
$$
如果\(p\)的质因子种类只有\(1\)种,\(a\)的个数要超过\(7\)。
$$
\begin{matrix}
1 & a & aa \\
aaa & aaaa & aaaaaaa \\
aaaaa & aaaaaa & p \\
\end{matrix}
$$
题解
分解质因数用\(Pollard-Rho\),然后判断即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll rand(ll l, ll r) {
static ll mo=1e9+7, g=78125, now=199811;
return l+((now*=g)%=mo)%(r-l+1);
}
ll mul(ll a, ll b, ll mo) {
a%=mo;
ll x=0;
for(; b; b>>=1) {
if(b&1) {
x+=a;
if(x>=mo) {
x-=mo;
}
}
a<<=1;
if(a>=mo) {
a-=mo;
}
}
return x;
}
ll ipow(ll a, ll b, ll mo) {
ll x=1;
for(; b; b>>=1, a=mul(a, a, mo)) {
if(b&1) {
x=mul(x, a, mo);
}
}
return x;
}
bool check(ll n) {
if(n==2 || n==3 || n==5 || n==7 || n==11 || n==13 || n==17 || n==19) {
return 1;
}
if(n%2==0 || n%3==0 || n%5==0 || n%7==0 || n%11==0 || n%13==0 || n%17==0 || n%19==0) {
return 0;
}
ll d=n-1;
int cnt=0;
for(; !(d&1); d>>=1, ++cnt);
for(int tt=0; tt<15; ++tt) {
ll now=ipow(rand(2, n-1), d, n), pre=now;
for(int i=0; i<cnt; ++i) {
now=mul(now, now, n);
if(now==1 && pre!=1 && pre!=n-1) {
return 0;
}
pre=now;
}
if(now!=1) {
return 0;
}
}
return 1;
}
ll gcd(ll a, ll b) {
return b?gcd(b, a%b):a;
}
ll poi(ll n, ll c) {
for(int i=2; i<=20; ++i) {
if(n%i==0) {
return i;
}
}
ll x=rand(1, n-1), y=x, g;
for(int k=2, i=2; ; ++i) {
x=mul(x, x, n)+c;
if(x>=n) {
x-=n;
}
if((g=gcd(n, (y-x+n)%n))!=1) {
return g;
}
if(x==y) {
return n;
}
if(k==i) {
y=x;
k<<=1;
}
}
}
void po(ll n, ll f[], bool flag=1) {
if(n==1) {
return;
}
if(check(n)) {
if(flag) {
return;
}
f[++f[0]]=n;
return;
}
ll d;
while((d=poi(n, rand(1, n-1)))==n);
po(d, f, 0);
po(n/d, f, 0);
}
ll f[35], a[35], n, m;
int num;
int main() {
while(~scanf("%lld%lld", &n, &m)) {
if(m%n) {
puts("Wario_wins!\n");
continue;
}
m/=n;
memset(f, 0, sizeof f);
num=0;
po(m, f);
if(f[0]) {
sort(f+1, f+1+f[0]);
a[num=1]=1;
for(int i=2; i<=f[0]; ++i) {
if(f[i]!=f[i-1]) {
a[++num]=1;
}
else {
a[num]++;
}
}
sort(a+1, a+1+num);
}
bool flag=num>=4 || (num==3&&a[num]>1) || (num==2&&((a[num]>1&&a[num-1]>1)||(a[num]>4))) || (num==1&&a[num]>7);
puts(flag?"Mario_wins!\n":"Wario_wins!\n");
}
return 0;
}
【BZOJ】2172: Mario填格子的更多相关文章
- ACM_填格子
填格子 Time Limit: 2000/1000ms (Java/Others) Problem Description: 在一个n*n格子里边已经填了部分大写字母,现在给你个任务:把剩下的格子也填 ...
- 动态规划-填格子问题 Domino and Tromino Tiling
2018-09-01 22:38:19 问题描述: 问题求解: 本题如果是第一看到,应该还是非常棘手的,基本没有什么思路. 不妨先从一种简化的版本来考虑.如果仅有一种砖块,那么,填充的方式如下.
- 填格子3*N的方框使用2*1的矩形进行填充
考虑每个位置的前一个状态 可以发现有 我们分别给他们编号 假设 现在填充到了i+1行,我们可以发现从i行可以通过填充转到i+1行的状态 第i行第j列表示 可以 从上一个转态 j 可以到达这个状态的j ...
- NOI模拟题4 Problem C: 填格子(board)
Solution 首先我们要有敏锐的直觉: 我们将每一列中不选哪种颜色看作是一个序列, 则我们发现这个序列要求相邻两位的颜色不同. 我们还发现, 一个这样的序列对应两种不同的合法的棋盘, 因此统计合法 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 使用GridVIew显示Gantt(甘特图),动态增减列
说明:本例是做了工厂的排机报表 一.根据查询日期初始化GridView列 private void IniGridView(DateTime p_DateS,DateTime p_DateE) { / ...
- [日常训练]常州集训day7
T1 Description 给定一个序列,初始为空.依次将$1-n$插入序列,其中$i$插到当前第$a_i$个数的右边($a_i=0$表示插到序列最左边).求最终序列. Input 第一行一个整数$ ...
- POJ 1020 Anniversary Cake(DFS)
Anniversary Cake Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit St ...
- BZOJ2303 APIO2011方格染色(并查集)
比较难想到的是将题目中的要求看做异或.那么有ai,j^ai+1,j^ai,j+1^ai+1,j+1=1.瞎化一化可以大胆猜想得到a1,1^a1,j^ai,1^ai,j=(i-1)*(j-1)& ...
随机推荐
- linux中创建gpio节点
转自:http://blog.chinaunix.net/uid-29165999-id-4296162.html #define GPIO_MAJOR 230 // major device NO. ...
- MySQL基础二
视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SEL ...
- 【JAVA基本数据类型包装类】
一.概述 JAVA中一共有8种数据类型,分别是byte short int long boolean float double char,与此相对应的,有8个类与它们分别对应: byte Byte ...
- maven 依赖查询
该文章源地址:http://xiejianglei163.blog.163.com/blog/static/1247276201362733217604/ 为方便个人使用,转载于此处. http:// ...
- Android使用JNI实现Java与C之间传递数据(转)
介绍Java如何将数据传递给C和C回调Java的方法. java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java.C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需 ...
- WORD2007多级列表
转自玄鸟翩翩 http://hi.baidu.com/shine_yen http://hi.baidu.com/shine_yen/item/01ff2255043bc1aeacc85722 用Wo ...
- selenium实战-自动退百度云共享群
必备知识 在官网上下好selenium-3.0.1-py2.py3-none-any.whl,然后进入下载文件所在的位置 pip install selenium-3.0.1-py2.py3-none ...
- SQL详解(下)
约束 *约束是添加在列上的,用来约束列的! 1. 主键约束(唯一标识) 特点:非空,唯一,被引用 创建表时指定主键的两种方式,分别为: CREATE TABLE stu( sid ...
- C#开发微信公众平台-就这么简单(附Demo)(转)
原文:http://www.cnblogs.com/xishuai/p/3625859.html 写在前面 阅读目录: 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文. ...
- 常用meta标签举例说明
本文是作者从百度百科和其他从网页中搜索到的资料,经综合整理,把常用meta标签列举并示例说明,仅供参考. 1.<meta charset="UTF-8"> --- ch ...