1479: [Nerrc1997]Puncher打孔机

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 22  Solved: 14
[Submit][Status][Discuss]

Description

打孔机是一种在票上打孔的装置, 假设票是一个M*N的矩阵,矩阵行列间距相等,你可以选择在M*N个位置上打穿或不打穿,这样就有 2^(M*N)-1(至少要打一个孔)不同的方案数。 但是我们的问题并不是这么简单的,如果两种方案经过如下的若干操作后,打穿的孔刚好重合,那么认为这两个方案是相同的: •翻转 •旋转0,90,180,270 •平行移动 显然如果两种方案上孔的数目不同,那么必然是不同的方案。现在你的问题就是给定M,N,算出所有不同的方案数。

Input

文件包含两个数M(≤6), N (≤10) ,用空格分开。

Output

只有一行,为所求的方案数。

Sample Input

3 3

Sample Output

85

HINT


题解:
  看到这道题,没有一点思路,看了题解才知道什么叫做恶心数学题【此处D膜拜出题人】
  我们考虑忽略平移对这道题目的影响,毕竟我们对于旋转翻转之类的比较了解,于是我们思考设立一个状态状态来包含所有置换
  •于是我们设:
    Fu-v表示u行v列的矩阵中,在其每条边上都至少有一个格子被染色,其本质不同的染色方案数。
    因为每条边上都有染色的格子,所以无论向哪个方向平移,都会有染色的格子移出矩阵,所以无法进行平移操作的,那么只需要考虑翻转和旋转了。
  •

    G0uv    表示每条边上都至少有一个格子被染色的u行v列的矩阵,总的染色方案数。

    G1uv  表示每条边上都至少有一个格子被染色的u行v列的矩阵,其通过旋转180度保持不变的染色方案数。

    G2uv  表示每条边上都至少有一个格子被染色的u行u列的矩阵,其通过旋转90度或270度保持不变的染色方案数。

    G3uv  表示每条边上都至少有一个格子被染色的u行v列的矩阵,其通过上下翻转保持不变的染色方案数。

    G4uv  表示每条边上都至少有一个格子被染色的u行v列的矩阵,其通过左右翻转保持不变的染色方案数。

    G5uv  表示每条边上都至少有一个格子被染色的u行u列的矩阵,其通过沿某条对角线翻转保持不变的染色方案数。

    求得所有的G值,F值就只需套用引理即可。而的求法也都大同小异。

  • 求法:容斥原理!!!

    就是应用容斥原理,将所有格子任意染色,减去第一行或者第u行或者第一列或者第v列没染色,再加上第1行和第u行均未染色……即:

    

    

    旋转180度不变,实际上就是前个格子任意染色,然后剩下的格子染色情况则由这些格子旋转得到,同样需要应用容斥原理:

    

    旋转90度或者270度,则是由左上角的个格子任意染色,然后剩下的格子染色情况则由这些格子旋转得到,同样需要应用容斥原理:

    

    上下翻转,则是由上半部分的个格子任意染色,然后剩下的格子染色情况则由这些格子旋转得到,同样需要应用容斥原理:

    

    左右翻转,则是由半边部分的个格子任意染色,然后剩下的格子染色情况则由这些格子旋转得到,同样需要应用容斥原理:

    

    

    沿对角线翻转,则是由对角线上面部分的个格子任意染色,然后剩下的格子染色情况则由这些格子旋转得到,同样需要应用容斥原理:

    

    

 

    完美解决!!!

    参考文献: 《Puncher》解题报告


 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#define ll long long
using namespace std;
ll ans;
int n,m;
int read()
{
int x=,f=; char ch;
while (ch=getchar(),ch<''||ch>'') if (ch=='-') f=-;
while (x=x*+ch-'',ch=getchar(),ch>=''&&ch<='');
return x*f;
}
ll ksm(ll x,int k)
{
ll res=;
for (int i=k; i; i>>=,x*=x) if (i&) res*=x;
return res;
}
ll get0(int u,int v)
{
ll res=;
res=ksm(,u*v)
-ksm(,(u-)*v)*-ksm(,u*(v-))*
+ksm(,(u-)*(v-))*+ksm(,(u-)*v)+ksm(,u*(v-))
-ksm(,(u-)*(v-))*-ksm(,(u-)*(v-))*
+ksm(,(u-)*(v-));
return res;
}
ll get1(int u,int v)
{
ll res=;
res=ksm(,ceil(u*v/2.0))
-ksm(,ceil(u*v/2.0)-u)-ksm(,ceil(u*v/2.0)-v)
+ksm(,ceil(u*v/2.0)-u-v+);
return res;
}
ll get2(int u,int v)
{
ll res=;
res=ksm(,ceil(u*v/4.0))-ksm(,(ceil(u*v/4.0)-u+));
return res;
}
ll get3(int u,int v)
{
ll res=;
res=ksm(,ceil(u/2.0)*v)
-ksm(,ceil(u/2.0)*(v-))*-ksm(,(ceil(u/2.0)-)*v)
+ksm(,ceil(u/2.0)*(v-))+ksm(,(ceil(u/2.0)-)*(v-))*
-ksm(,(ceil(u/2.0)-)*(v-));
return res;
}
ll get4(int u,int v)
{
ll res=;
res=ksm(,u*ceil(v/2.0))
-ksm(,(u-)*ceil(v/2.0))*-ksm(,u*(ceil(v/2.0)-))
+ksm(,(u-)*ceil(v/2.0))+ksm(,(u-)*(ceil(v/2.0)-))*
-ksm(,(u-)*(ceil(v/2.0)-));
return res;
}
ll get5(int u,int v)
{
ll res=;
res=ksm(,u*(u+)/2.0)-ksm(,(u-)*u/2.0)*+ksm(,(u-)*(u-)/2.0);
return res;
}
ll get(int u,int v)
{
ll res=;
if (v==)
{
if (u==) return ;
return (ksm(,u-)+ksm(,(u+)/2.0-))/2.0;
}
else
{
if (u==v)
{
res=(get0(u,v)+get1(u,v)+*get2(u,v)+get3(u,v)+get4(u,v)+*get5(u,v));
return res/;
}
else if (u>v)
{
res=(get0(u,v)+get1(u,v)+get3(u,v)+get4(u,v));
return res/;
}
}
}
int main()
{
n=read(); m=read();
for (int u=; u<=max(n,m); u++)
for (int v=; v<=min(u,min(n,m)); v++)
ans+=get(u,v);
printf("%lld\n",ans);
return ;
}

Bzoj1479: [Nerrc1997]Puncher打孔机的更多相关文章

  1. bzoj AC倒序

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

  2. 【bzoj1479】[NOI2006]最大获利

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4335  Solved: 2123[Submit][Status] ...

  3. C#的前世今生,学会C#还能找到高薪工作吗?

    其实C#,.net正在逐步淡出程序员的视野是正在发生的现实,量子及量子的小伙伴们,还在坚持写C#代码的人几乎没有了,回忆起过去那些写C#时候的美好时光,真是不胜唏嘘,最近园子里的一篇<C#程序员 ...

  4. MQL4程序:一个号称成功率100%的EA程序 .mq4

    用​m​t​4​平​台​所​提​供​的​m​q​l​4​语​言​编​写​.​风​险​与​利​润​同​在​,​高​风​险​可​博​得​高​利​润​.​自​己​把​握​.​已​经​测​试​通​过​,​下​ ...

  5. Java语言概述

    1.1 基础知识 ·第一代语言 打孔机--纯机器语言 ·第二代语言 汇编 ·第三代语言 C.Pascal.Fortran面向过程的语言 C++面向过程/面向对象 Java跨平台的纯面向对象的语言 .N ...

  6. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  7. 当C++学到第20天的时候我崩溃了(找回刚开始的激情)

    首先声明,我是个使用多语言(ASM/C/C++/Java/Perl)的人,主要使用C++和Java所以我认为我的意见还算中肯.那些否定C++的人,你们是否了解————Borland鼓吹Delphi如何 ...

  8. 【C++探索之旅】开宗明义+第一部分第一课:什么是C++?

    内容简介 1.课程大纲 2.第一部分第一课:什么是C++? 3.第一部分第二课预告:C++编程的必要软件 开宗明义 亲爱的读者,您是否对C++感兴趣,但是C++看起来很难,或者别人对你说C++挺难的, ...

  9. Machine Learning/Random Projection

    这次突然打算写点dimension reduction的东西, 虽然可以从PCA, manifold learning之类的东西开始, 但很难用那些东西说出好玩的东西. 这次选择的是一个不太出名但很有 ...

随机推荐

  1. 剑指offer替换空格

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  2. 去掉tomcat中appBase默认的ROOT

    我想修改tomcat的项目目录,写成绝对路径后,默认去找ROOT文件夹 怎么去掉呢 <Host name="localhost" appBase="E:\ceshi ...

  3. 使用命令将logcat中的内容输出到文本文件中

    网上搜集的方法,自己只是试了一下第一种,很好用,如果是/mylogcat.txt 直接保存在了d盘,我猜是直接保存在了sdk所在的盘的根目录下,希望对大家有帮助 使用如下命令可以将logcat中的内容 ...

  4. 基于ATmgea8单片机设计的加热控制系统(转)

    源:http://blog.163.com/zhaojun_xf/blog/static/3005058020085102562729/ 1 引言 温度是工业生产中主要的被控参数之一,与之相关的各种温 ...

  5. 【dp】 poj 1953

    用n个数字0或者1组成一个排列,要求每两个1不相邻,问有多少种排法 dp[n][0]记录n个连续数,结尾为0的不同排列数dp[n][1]记录第n个连续数,结尾为1的不同排列数 DP公式: dp[i][ ...

  6. Struts1.x教程:配置文件总结

    要想使用Struts,至少要依靠两个配置文件:web.xml和struts-config.xml.其中web.xml用来安装Struts框架.而struts-config.xml用来配置在Struts ...

  7. 排座椅(seat)

    排座椅(seat) 题目描述 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课 ...

  8. led.c驱动框架2nd

    led.c: #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h> ; v ...

  9. Android复习--广播

    广播有两种方式,一种静态广播,一种动态广播. 静态广播-->静态广播接收器在配置文件里面注册. 动态广播-->而动态广播接收器在代码里面注册. 广播的发送: Context.sendBro ...

  10. Android WiFi管理(WIFI_SERVICE)

    Android WiFi管理(WIFI_SERVICE) 分类: Android2011-11-24 10:52 2000人阅读 评论(1) 收藏 举报 androidservicebuttonlay ...