c语言 打印奇数魔法阵,[luogu2119]魔法阵 NOIP2016T4
很好的一道数学推导题
45分做法
$O(N^4)$暴力枚举四个材料
55分做法
从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分
100分做法
首先可以发现每个$x$都小于n,而$n$最大值只是$15000$,所以可以开一个桶来存每个魔法值出现的次数
回忆一下3个约束条件
$xa
$xb-xa=2(xd-xc)$ ②
$xb-xa
现在魔改一下这三个式子
设$t=xd-xc$
所以②可化为$xb-xa=2t$ ④
将④代入③
$2t
移项一下,就变成
$6t
再魔改一下
设$6t+k=xc-xb$(就是把差的部分补上去)
于是可以画出来一个图
显然,$A$的最小值为$1$,$D$的最大值为$n$
由图可得$AD=9t+k$
所以我们可以尝试着枚举t,用t来表示各个魔法值的值
由上易得t的范围为$1<=t<=(n-1)/9$
在代码中为了避免除法写成$t*9
再枚举D,因为我们已经枚举出了t,所以C的值是可以直接算出来的
$C=D-t$
又因为使$A,B,C,D$满足条件的k的最小值为1,所以对于当前的C和D,最大的A和B为$A=D-9t-1,B=D-7t-1$
那么如果A和B更小怎么办?
观察到在其他条件不变的情况下,只要$C$和$B$满足$Xc-Xb>6t$,那么这个魔法阵就一定成立,所以当$(a1
然后又由乘法原理可得,当前魔法值作为$D$物品的个数为$SumD=SumA*SumB*SumC$
所以我们利用前缀和优化$SumA*SumB$
C的情况可以顺便在算D的时候算出来
那么还有一个问题是,我们枚举的D的范围是多少?
因为要统计前缀和,所以一定是要顺推下去的,由上面那张图我们可以知道,D的最大值为n,最小值则为当k=1且A=1的时候,所以D的最小值为$9*t+2$,再小是无法组成魔法阵的
同理可以枚举A
但是这个的情况又和枚举D的情况有一点不同
在其他条件不变的情况下,只要$C$和$B$满足$Xc-Xb>6t$,那么这个魔法阵就一定成立,所以当$(c1
因为需要统计后缀和,所以需要逆推
枚举的范围:A的最大值为$(n-t*9-1)$(因为当k=1,D=n的时候A才最大),A的最小值则为1
所以就可以算出每个魔法值作为$A,B,C,D$物品的次数了,输出时直接输出当前魔法物品的魔法值的次数就可以了
#include
#include
using namespace std;
inline int read(){
int x=,f=;char c=getchar();
while(c''){if(c=='-')f=-f;c=getchar();}
while(c>=''&&c<=''){x=(x<
return x*f;
}
#define N 50010
int n,m;
int a[N],b[N],c[N],d[N];
int x[N],vis[N];
int main(){
n=read();m=read();
for(int i=;i<=m;i++)
x[i]=read(),vis[x[i]]++;
for(int t=;t*
int sum=;
for(int D=*t+;D<=n;D++){
int A=D-*t-;
int B=A+*t;
int C=D-t;
sum+=vis[A]*vis[B];
c[C]+=vis[D]*sum;
d[D]+=vis[C]*sum;
}
sum=;
for(int A=n-*t-;A;A--){
int B=A+*t;
int C=B+*t+;
int D=A+*t+;
sum+=vis[C]*vis[D];
a[A]+=vis[B]*sum;
b[B]+=vis[A]*sum;
}
}
for(int i=;i<=m;i++){
printf("%d %d %d %d\n",a[x[i]],b[x[i]],c[x[i]],d[x[i]]);
}
return ;
}
参考资料:
(如果看不懂我的题解可以去看一下学长的qwq,我是看他的题解才懂这道题怎么写的,然后自己再归纳总结一下才写出来这篇博客)
洛谷 P2119 魔法阵
题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有mm个魔法物品,编号分别为1,2,...,m1,2,...,m.每个物品具有一个魔法值,我们用X_iXi ...
【DFS】佳佳的魔法阵
[vijos1284]佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放…… 描述 ...
洛谷P2119 魔法阵
P2119 魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编 ...
[NOIP2016普及组]魔法阵
题目:洛谷P2119.Vijos P2012.codevs5624. 题目大意:有n件物品,每件物品有个魔法值.要求组成魔法阵(Xa,Xb,Xc,Xd),该魔法阵要满足Xa
P2119 魔法阵
原题链接 https://www.luogu.org/problemnew/show/P2119 YY同学今天上午给我们讲了这个题目,我觉得她的思路很好,特此写这篇博客整理一下. 50分:暴力枚举 ...
洛谷 题解 P2119【魔法阵】
很好的一道数学推导题 45分做法 \(O(N^4)\) 暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先 ...
题解 【NOIP2016】魔法阵
[NOIP2016]魔法阵 Description 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法 ...
[NOIP2016PJ]魔法阵
今天模拟赛的题,,,唯一没有Giao出来的题(不然我就AKIOI了~) 最开始没想到数学题,把所有部分分都说一遍吧: 35分:纯暴力O(M^4)枚举,对于每一组a,b,c,d验证其是否合法. 60分: ...
「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵
佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...
随机推荐
[转]java反射机制
c语言 打印奇数魔法阵,[luogu2119]魔法阵 NOIP2016T4相关推荐
- c语言两个线程交替打印奇数和偶数,经典面试题——两个线程交替打印奇数和偶数...
今天在和同事讨论线程说到了这个我就实现了一把 直接贴代码 public class Demo2 { private static volatile int i = 1; public static v ...
- c语言字母沙漏,C语言打印沙漏,
C语言打印沙漏, 一.题目: 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓" ...
- 如何运用C语言打印出菱形
运用C语言打印出菱形 #include <stdio.h> #include <stdlib.h> void main() {int line; //菱形总行数int colu ...
- C语言打印1000以内的完数
C语言打印1000以内的完数 #include <stdio.h> int main() {int m, s, i;int n = 1000;for (m = 2; m <= n; ...
- C语言打印等腰三角形
C语言打印等腰三角形 #include <stdio.h> int trangle(int n) {int i, j;for (i = 0; i < n; i++){for (j = ...
- C语言打印100-200之间的素数
** C语言打印100-200之间的素数 ** #include<stdio.h> int main() {int i = 0;int j = 0;int count = 0;for (i ...
- c语言ffffff错误,C语言打印16进制出现0xffffff现象的问题剖析!
C语言打印16进制出现0xffffff现象的问题剖析! 其实类似的问题不是只在网络程序中才会出现的,看示例代码: 复制代码 1 #include 2 int main() 3 { 4 char ...
- C语言打印字符串的所有排列组合(附完整源码)
C语言打印字符串的所有排列组合 字符串的所有排列问题 C语言打印字符串的所有排列组合的完整源码(定义,实现,main函数测试) 字符串的所有排列问题 示例:ABC的排列是ABC,ACB,BCA,BAC ...
- C语言打印链表的中间节点的算法(附完整源码)
C语言打印链表的中间节点的算法 C语言打印链表的中间节点的算法完整源码(定义,实现,main函数测试) C语言打印链表的中间节点的算法完整源码(定义,实现,main函数测试) #include < ...
- 用c语言打印自定义的乘法口诀表。例如:输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表。...
用c语言打印自定义的乘法口诀表.例如:输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表. #include <stdio.h> int main () { int n; in ...
最新文章
- Python find方法与rfind方法的使用
- 汇编试验十五:安装新的int 9中断例程
- 【Ubuntu】dpkg-deb -c :查看deb文件中的内容
- 如何禁止页面被 jframe 引用_PD1该如何使用?靶向能否转用PD1?
- Rosalind: 兔子与递归
- MySql按周,按月,按日分组统计数据
- php图片生成缩略图_PHP生成图片缩略图类示例
- webpack入门与笔记
- 华为鸿蒙os什么时候应用上线,华为 HarmonyOS :即日起,全新上线鸿蒙 100 问
- oracle clob截取_Oracle数据库设计规范建议
- [凯立德]2013.12.17凯立德发布秋季版(2F21J0E)最新增量包SP1
- matlab的findpeak 极点查找
- 2008-05-23
- 接口自动化测试框架搭建(1、环境、框架的思路及目录构成)--python+HTMLTestRunnerCN+request+unittest+mock+db
- Fortran入门——菜鸟级基础语法
- 快速开发实用工具VRTK-011
- 佳能mf4400打印机无线服务器,佳能Canon imageCLASS MF4400 驱动
- php 中文逗号 转英文,PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式...
- kazoo在多进程下使用全局连接死锁问题
- Linux 只查找两层备份目录文件大小
热门文章
- mysql打字竖线_如何打出竖线,教你怎样键盘打出竖线?
- Java小程序--多彩时钟表盘的制作
- 计算两个经纬度点之间的距离
- 鲁冠球:冲向世界的打铁匠
- 王垠:完全用Linux工作 (转载)
- html语言type,HTML中type是什么意思?
- 加速进化,浪潮存储正在梦想成真
- (predicted == labels).sum().item()
- 局部敏感哈希-Locality Sensitivity Hashing
- 温度转换 python