博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】2172: Mario填格子
阅读量:7262 次
发布时间:2019-06-29

本文共 3080 字,大约阅读时间需要 10 分钟。

题意

\(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 
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
=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;}

转载地址:http://vsddm.baihongyu.com/

你可能感兴趣的文章
高级PHP工程师应该具备的一些技能
查看>>
使用redis—geo api实现搜索附近的人,自己写的一个composer包
查看>>
IE8浏览器下,解决jQuery append方法不生效的问题
查看>>
JS进阶篇--window.requestAnimationFrame与Tween.js配合使用实现动画缓动效果
查看>>
如何定制 Horizon
查看>>
快手服务治理平台KESS的设计理念和实战
查看>>
过早扩张、未经检验的技术,创业公司最易跳入哪些致命陷阱?
查看>>
重构了后端服务,我学到了这些东西
查看>>
360开源又一力作——KafkaBridge:让操作kafka更简单!
查看>>
敏捷2016大会主题演讲:现代敏捷
查看>>
那些到了 30 岁的技术人,后来都去哪了?
查看>>
自动化部署打破混乱之墙 助力开发、运维、测试协同作战
查看>>
揭秘又拍云凭啥做到两年估值超10亿?
查看>>
消息称微软计划收购GitHub,估值超50亿美元
查看>>
Submarine:在 Apache Hadoop 中运行深度学习框架
查看>>
Rust 2018临近:设法从Rust 2015过渡
查看>>
在ASP.NET Core应用程序中使用分布式缓存
查看>>
锋利的 jQuery (第二版) 认识 jQuery
查看>>
每秒解析千兆字节的JSON解析器开源,秒杀一大波解析器!
查看>>
监控SRE的黄金信号
查看>>