题意

\(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填格子的更多相关文章

  1. ACM_填格子

    填格子 Time Limit: 2000/1000ms (Java/Others) Problem Description: 在一个n*n格子里边已经填了部分大写字母,现在给你个任务:把剩下的格子也填 ...

  2. 动态规划-填格子问题 Domino and Tromino Tiling

    2018-09-01 22:38:19 问题描述: 问题求解: 本题如果是第一看到,应该还是非常棘手的,基本没有什么思路. 不妨先从一种简化的版本来考虑.如果仅有一种砖块,那么,填充的方式如下.

  3. 填格子3*N的方框使用2*1的矩形进行填充

    考虑每个位置的前一个状态 可以发现有 我们分别给他们编号 假设 现在填充到了i+1行,我们可以发现从i行可以通过填充转到i+1行的状态 第i行第j列表示 可以 从上一个转态 j 可以到达这个状态的j ...

  4. NOI模拟题4 Problem C: 填格子(board)

    Solution 首先我们要有敏锐的直觉: 我们将每一列中不选哪种颜色看作是一个序列, 则我们发现这个序列要求相邻两位的颜色不同. 我们还发现, 一个这样的序列对应两种不同的合法的棋盘, 因此统计合法 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. 使用GridVIew显示Gantt(甘特图),动态增减列

    说明:本例是做了工厂的排机报表 一.根据查询日期初始化GridView列 private void IniGridView(DateTime p_DateS,DateTime p_DateE) { / ...

  7. [日常训练]常州集训day7

    T1 Description 给定一个序列,初始为空.依次将$1-n$插入序列,其中$i$插到当前第$a_i$个数的右边($a_i=0$表示插到序列最左边).求最终序列. Input 第一行一个整数$ ...

  8. POJ 1020 Anniversary Cake(DFS)

    Anniversary Cake Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit St ...

  9. 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)& ...

随机推荐

  1. Avalon学习

    1.认识AvalonAvalon是一个简单易用的迷你的MVVM框架,作者是博客园的司徒正美,去哪儿.搜狐等等都用这个框架.没有任何依赖,兼容性非常好,支持IE6,不到5000行,压缩后不到50KB.官 ...

  2. Jmeter在restful风格接口测试中的应用

    1.如何下载安装 官网下载,一个压缩包apache-jmeter-3.0.zip,解压即可,打开bin目录下jmeter.bat即可打开软件. 2.熟悉界面 3.实际案例 测试restful风格接口 ...

  3. C# SMTP邮件发送 分类: C# 2014-07-13 19:10 334人阅读 评论(1) 收藏

    邮件发送在网站应用程序中经常会用到,包括您现在看到的博客,在添加评论后,系统会自动发送邮件通知到我邮箱的,把系统发送邮件的功能整理了下,做了一个客户端Demo,希望对有需要的童鞋有所帮助: 核心代码: ...

  4. PathFinding.js 寻路类神器

    最近有打算写个迷宫玩玩,无意中发下了这个库,很强大!又是开源在github的,并且有一个相当酷的demo.这个库不仅支持浏览器端的运行,而且可以运行在node.js上.怎么用到服务器上这里就不涉及了, ...

  5. JS 捕获 input 中 键盘按键

    JS 捕获 input 中 键盘按键 的相应处理事件是很简单的,google搜索一下很容易找到处理方式,请看如下一种简单的处理方式: HTML代码: <div> <input typ ...

  6. Codeforces Beta Round #89 (Div. 2) E. Bertown roads(Tarjan、边双连通分量)

    题目链接:http://codeforces.com/problemset/problem/118/E 思路:首先要判断图是否是边双连通,这个Tarjan算法可以判断,若low[v] > dfn ...

  7. 如何在Ubuntu中让mongo远程可连接

    最近团队的一个成员由于项目原因需要在vps上建立mongo数据库服务器并允许远端访问,这里整理下设置的思路 首先需要安装mongo apt-get updateapt-get install mong ...

  8. scrollTo , scrollBy区别

    View视图中scrollTo 与scrollBy这两个函数的区别 . 首先 ,我们必须明白在Android View视图是没有边界的,Canvas是没有边界的,只不过我们通过绘制特定的View时对 ...

  9. C++ 拷贝构造函数 和 六大函数

    1.  C++什么时候会调用 拷贝构造函数? a.一个对象作为函数参数,以值传递的方式传入函数体: b.一个对象作为函数返回值,以值传递的方式从函数返回:(实际使用时,会被编译器优化掉) c.一个对象 ...

  10. JQuery 定时器 (Jquery Timer 插件)

      jQuery Timers插件地址: http://plugins.jquery.com/project/timers JQuery Timers应用知识提供了三个函式1. everyTime(时 ...