思路:

明显的DP,所以我考试时用的搜索............
100的数据搜到 6*6 就爆了....尴尬 (0.0)
还是来讲讲DP吧
这题有3种情况 一是 这列不放炮
二是放一个炮  三是放两个炮(这不废话么.....)
那么 我们就开三维数组 f[k][i][j]代表前k行有i列放了一个炮
有j列放了两个炮 那么没放炮的也很容易表示
那么状态有如下几种
1丶哪一列也不放炮时 f[k][i][j]=f[k-1][i][j]
2丶在没有炮的一列放一个炮时f[k][i][j]=f[k-1][i-1][j]*(m-i-j+1);//由于当前状态是有i列有一个炮//             j列有两个炮//             (m-i-j)列没有炮//所以推出它上一个状态 有(i-1)列有一个炮//             j列有两个炮//             (m-i-j+1)列没有炮//没有炮的列都可以放炮 所以是f[k-1][i-1][j]*(m-i-j+1);//其他状态大同小异就不详细解释了
3丶在有一个炮的一列放一个炮 f[k][i][j]=f[k-1][i+1][j-1]*(i+1);
4丶在没有炮的两列中各放一个炮f[k][i][j]=f[k-1][i-2][j]*Q(m-j-i+2);//Q的具体含义见代码
5丶在有一个炮的两列各放一个炮f[k][i][j]=f[k-1][i+2][j-2]*Q(i+2);
6丶在没有炮和有一个炮的两列中各放一个炮//等同于在没有炮的一列中放两个炮f[k][i][j]=f[k-1][i][j-1]*(m-i-j+1)*i;

代码:

#include<cstdio>
#include<iostream>
#define MAXN 101
#define MOD 999983
#define ll long long
using namespace std;
ll f[MAXN][MAXN][MAXN],ans;
int n,m;
inline void read(int&x) {int f=1;x=0;char c=getchar();while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9') x=10*x+c-48,c=getchar();x=x*f;
}
inline int Q(int t) {return t*(t-1)/2;
}
int main() {freopen("cannon.in","r",stdin);freopen("cannon.out","w",stdout);read(n);read(m);f[0][0][0]=1;for(int k=1;k<=n;k++)for(int i=0;i<=m;i++)for(int j=0;j<=m-i;j++) {f[k][i][j]=f[k-1][i][j];if(i) f[k][i][j]+=f[k-1][i-1][j]*(m-i-j+1);if(j&&i<m) f[k][i][j]+=f[k-1][i+1][j-1]*(i+1);if(i>1) f[k][i][j]+=f[k-1][i-2][j]*Q(m-i-j+2);if(j>1&&i<m-1) f[k][i][j]+=f[k-1][i+2][j-2]*Q(i+2);if(i&&j) f[k][i][j]+=f[k-1][i][j-1]*(m-i-j+1)*i;f[k][i][j]%=MOD;}for(int i=0;i<=m;i++)for(int j=0;j<=m-i;j++)ans=(ans+f[n][i][j])%MOD;printf("%d\n",ans);fclose(stdin);fclose(stdout);return 0;
}

思路:

组合数....
真是瞎了我的24K钛合金狗眼
竟然看不出来
我们让n>m
所以n行中最多有m行可以放車
也就是在n中选m个数一样的思路...
求组合数可以先分解一下质因数 然后把除法去掉
对于只有乘法 只保留最后100位
最后  这要用高精!!!

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define rep(i,x,y) for(i=x;i<=y;i++)
#define _rep(i,x,y) for(i=x;i>=y;i--)
#define MIN(x,y) ((x)<(y)?(x):(y))const int MAXN=10000010;
const int MAXLEN=50;
int n,m,i,j;
int tot[MAXN];
bool pd[MAXN];
struct bignumber
{int num;int s[MAXLEN+1];void clear(){num=0;memset(s,0,sizeof(s));}
}ans,now;
bignumber operator*(bignumber a,bignumber b)
{int i,j;bignumber c;c.clear();rep(i,1,MIN(MAXLEN,a.num))rep(j,1,MIN(MAXLEN-i+1,b.num))c.s[i+j-1]+=a.s[i]*b.s[j];rep(i,1,MAXLEN){   if(i<MAXLEN)c.s[i+1]+=c.s[i]/10;c.s[i]%=10;}c.num=MAXLEN;while(c.num>1&&c.s[c.num]==0)c.num--;return c;
}
bignumber pow(int x)
{if(x==1)return now;bignumber ans=pow(x/2);ans=ans*ans;if(x&1)ans=ans*now;return ans;
}void zhuan(int i)
{now.clear();while(i>0)now.s[++now.num]=i%10,i/=10;
}
void print(bignumber a)
{int i;_rep(i,a.num,1)printf("%d",a.s[i]);printf("\n");
}
int main()
{freopen("rook.in","r",stdin);freopen("rook.out","w",stdout);scanf("%d%d",&n,&m);if(n<m)swap(n,m);rep(i,1,m)tot[i]-=1;rep(i,n-m+1,n)tot[i]+=1;memset(pd,1,sizeof(pd));rep(i,2,n)if(pd[i])_rep(j,n/i,2){pd[i*j]=0;tot[i]+=tot[i*j];tot[j]+=tot[i*j];tot[i*j]=0;}ans.num=1;ans.s[1]=1;rep(i,2,n)if(tot[i]>0)zhuan(i),ans=ans*pow(tot[i]);print(ans);return 0;
}


思路:

这个裸暴力只有70分
(尽管我暴力超时不要不要的)(0.0)
实际上这题是可以用位运算优化的
以行为阶段 记录之前每一列的信息和两条对角线的信息
列好办 关键是这个对角线比较丑 因为他是斜着的
假设当前行我们放在了i这里
那么下一行的话 就是i左边 和i右边不能放
这里利用位运算的左移右移就好了
然后还有些小技巧 就是枚举当前行放在哪
利用 lowbit 找最小的不是0的位在哪
还有就是 状态记录的时候0表示还可以放
但是涉及到 lowbit 这个 我们用的时候去一下反
1 表示还可以放  这就非常优美了

代码:

#include<cstdio>
using namespace std;
#define rep(i,x,y) for(i=x;i<=y;i++)
const int MAXN=16;
int n,i,j,x,ans;
int a[MAXN];
void search(int i,int S1,int S2,int S3)
{if(i==n){ans++;return;}int j,_S=((1<<n)-1)&(~(a[i]|S1|S2|S3));while(_S>0){j=_S&(-_S);search(i+1,S1^j,(S2^j)>>1,(S3^j)<<1);_S-=j;}
}
int main()
{freopen("queen.in","r",stdin);freopen("queen.out","w",stdout);scanf("%d",&n);rep(i,0,n-1)rep(j,0,n-1)scanf("%d",&x),a[i]+=x<<j;search(0,0,0,0);printf("%d\n",ans);return 0;
}

11.2 NOIP模拟赛 (morning)相关推荐

  1. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  2. 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)

    [题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...

  3. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  4. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  5. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  6. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  7. 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告

    [WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...

  8. NOIP 模拟赛 长寿花 题解

    NOIP 模拟赛 长寿花 题解 要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件: 同一层两个相邻物品颜色不能相同. 相邻两层颜色集 ...

  9. NOIP模拟赛套路技巧经验总结

    前言 还有2天就NOIP了,之前做了这么多场模拟赛,是时候拿出来总结一下, 算是给自己一针强心剂. 列表 从最近的考试总结起(个人认为的重点,可能有重复,仅供参考): (转化很重要,一定要简化问题过后 ...

最新文章

  1. 【Python培训基础知识】Python生成器函数
  2. 过去的一年,我在读研
  3. 今年最火的 Golang 云原生开源项目,可能就是它了!
  4. 实际应用中git(合并本地与服务器项目)
  5. pythondockerapi_docker-py 用Python调用Docker接口的方法
  6. 动态修改dom node的两种方法性能比较
  7. php游客随机代码,php生成随机码的一段代码
  8. Android学习笔记:TabHost 和 FragmentTabHost
  9. 数据结构- 栈(实现综合计算器)(一位数计算 扩展到 多位数计算)
  10. android找不到符号_快速搭建Android开发环境——Android Studio(附ADB找不到设备)...
  11. 20145326蔡馨熤《计算机病毒》——静态分析(2)
  12. c语言如何删除链表相同元素,【图片】想问一道链表题,如何删除重复元素【c语言吧】_百度贴吧...
  13. redhat8.1网卡配置教程
  14. 一代测序原理 (Sanger法测序)
  15. LARGE SCALE IMAGE COMPLETION VIA CO-MODULATED
  16. android压力测试之monkey详解
  17. excel之countifs函数
  18. c语言实现定积分运算
  19. Android之拍照后删除图片
  20. ListView动态刷新

热门文章

  1. 有道字典主窗口初始化失败、暴风影音停止工作的诡异问题
  2. Ubuntu16.04下Opencv3.4.5的卸载与带cuda安装
  3. matlab n(),MATLAB N个实用技巧:MATLAB中文论坛精华总结(第2版)
  4. Spring容器的启动流程
  5. 高考志愿填报网站服务器,高考后填报志愿必须遵守的原则
  6. 泛微OA在公立三甲医院:推动建立完善财务预算数字化管理体系
  7. android愤怒小鸟游戏、自定义View、掌上餐厅App、OpenGL自定义气泡、抖音电影滤镜效果等源码... 1
  8. crontab定时脚本常见报错
  9. fopen 和它的读写标识 r、r+、rb+、rt+、w+.....
  10. C语言关于建筑物高度范围问题