【BZOJ3823】【East!模拟赛_Round5T1】定情信物 推公式+线性筛逆元(推公式法比出题人简)

题解1:

我们定义点为0维元素、线为1维元素、面为2维元素……

既然一个低维超方体在对应新轴上平移得到高一维的超方体,比如二维超方体为一个面,然后沿新出现的z轴拓展,那么一个低维元素就会增加一维变成高一维的元素,比如点变成线、线变成面、面变成体……

这样就有一个推式:

高维元素会由第一维的元素衍生、同维元素复制保留,

也就是一个超方体升维之后,高维超方体第i维元素的数量将是原超方体第i维的数量*2+(i-1)维的数量。

然后经过鬼畜的推导/撞大运的找规律,可以得到一个组合数公式,

最后加个线性筛逆元,再注意注意内存就可以过了。

题解2:

从元素的度数关系着手,存在一个规律:

一个x维元素对应的x-1维元素的数量固定不变,比如一条线永远俩点,一个面永远4个点……i维元素对应2i个(i-1)维元素。而x维元素对应的x+1维元素的数量随着维度增加而单位增加,比如二维超方体(面)中一点两线,三维(立方体)中一点三线,即:

一个x维元素在y维中对应(y-x)个(x+1)维元素。

然后根据点数的倍增,我们可以得到所求超方体的0维元素(点)的个数,然后根据公式可以推导出更高维元素的个数,这样就可以O(n)出解,不过因为取模种种,还需要一个线性筛逆元~~

我的方法就是这个,可惜……快速幂long long 写成了 int!!!!!弱死了。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 10001000
using namespace std;
int n,p;
long long A[2];
long long inv[N];
long long power(long long x,int k)
{
	long long ans=1;
	while(k)
	{
		if(k&1)ans*=x,ans%=p;
		x*=x,x%=p;
		k>>=1;
	}
	return ans;
}
void getinv(int x)
{
	inv[1]=1;
	for(int i=2;i<=x;i++)
		inv[i]=(long long)(p-p/i)*inv[p%i]%p;
}
int now,last;
int main()
{
	int i,j,k;
	scanf("%d%d",&n,&p);
	now=0,last=1;
	A[0]=power(2,n);
	getinv(n);
	long long ans=A[0];
	for(i=1;i<=n;i++)
	{
		now^=1,last^=1;
		A[now]=A[last]*(n-i+1)%p*inv[i]%p*inv[2]%p;
		ans^=A[now];
	}
	cout<<ans<<endl;
	fclose(stdin);
	fclose(stdout);
	return 0;
}
时间: 2024-12-25 07:35:12

【BZOJ3823】【East!模拟赛_Round5T1】定情信物 推公式+线性筛逆元(推公式法比出题人简)的相关文章

定情信物(bzoj 3823)

Description 都说程序员找不到妹子,可是无人知晓,三生石上竟然还刻着属于小 E 的一笔. 那一天,小 E 穷尽毕生的积蓄,赠与了妹子一个非同寻常的定情信物.那是一个小 小的正方体,但透过它,可以看到过去,可以洞彻天机. 这份信物仿佛一只深邃的眼.当看透它看似简单的外表后,深邃的内心却最是可以 叩击人的灵魂的.不出所料,妹子果然被这个信物超越空间的美所吸引. "易有太极,是生两仪,两仪生四象,四象生八卦.,八卦定吉凶,吉凶生大业." 这句箴言在其上得到了完美的诠释. 是的,这正

BZOJ 3823 定情信物 递推

题目大意:定义点为零维元素,线为一维元素,面为二维元素,空间为三维元素,以此类推,求n维立方体中各维元素都有多少 令f[i][j]为i维立方体内j维元素的个数 考虑n维立方体中的i维元素,将n维立方体拓展至n+1维空间时(觉得抽象的可以想象平面扩展成立方体) 原先的i维元素增加了一倍,同时原先的i-1维元素变为了i维元素 故有f[i][j]=f[i-1][j]*2+f[i-1][j-1] 经过一系列的推导(我不会怎么推,我是打表之后斜着找规律的),可以得到f[i][j]=2^(i-j)*C(i,

【East!模拟赛 Round_VI】(YGY_Round) 题目

一. 题目概况 中文题目名称 黑暗侵袭 虚空遁地 血色薇恩 英文题目名称 dark foul vn 可执行文件名 dark foul vn 输入文件名 dark.in foul.in vn.in 输出文件名 dark.out foul.out vn.out 每个测试点时限 1sec 1sec 3sec 每个测试点内存限制 128Mb 128Mb 512Mb 附加样例文件 有 有 有 结果比较方式 全文比较(过滤行末空格及文末回车) 题目类型 ╮(╯▽╰)╭ (⊙_⊙)? 一 一+ 二. 其它限制

BZOJ 3823 定情信物 线性筛乘法逆元

题目大意:n维多面体中有多少n-1维,n-2维,n-3维...1维元素,求他们的异或和并%p. 思路:考试题,当时做的时候不会线性筛乘法逆元,就得了70分... 算法和标程不太一样,标程好象是递推,但是我空间想象力不够,没推出来..只能找规律了..花了一个半小时才找出来的规律.. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #defin

【East!模拟赛】【Round1】【codeforces455B】题解。

A:codeforces Round#260 div1 B [a lot of games]. 题解:俩人玩游戏,有若干个字符串,每一轮都是俩人轮流念一个字母,使得当前的这些字母是其中一个字符串或者其前缀,即在字典树上走,每人走一步,走不了的人输,然后有m轮,每轮输的下一轮先手,问最后一轮谁赢? 题解: 显然这是一道博弈题,但是如果我们单纯地计算每一局是先手赢还是后手赢,那就要跪了. 因为:先手可以选择输,以保证下一局的先手,然后一直先手,最后一局再选择赢!!! 那么我们就需要多判断几种状态.

【East!模拟赛】【Round1】【BZOJ2324】营救皮卡丘 有下界的费用流

题意:不多说了. 题解: begin 首先想到:我们要强制走过那些下界. 怎么强制呢?我们把费用赋为-inf!!看他走不走! 然后费用的初值就需要把这些扣掉的inf加回来. end. 贴代码: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 500 #define M 201000 #d

【East!模拟赛】【Round1】【BZOJ1017】魔兽地图Dotr 树形DP

题意不多说. 曰: 呃,首先显然这是一个树形DP. 然后我不会什么高大上的算法,我只能提供一种非常慢,但是能在BZ切的算法(因为是总时限并且还有O2). 题解: 不需要新建树,这个树就行. 首先这道题一眼就能想到树形背包..但是树形背包怎么做呢? 因为需要合成,所以这里的状态F[i][j][k]并不是i节点有j个花费为k时的最大收益,而是i节点给其父亲j个花费k时的最大收益(不含父亲收益).好吧,这个我自己没想出来,但是或许我可以给你讲讲怎么想出来. 我们考虑这道题有两个难点: 第一个是怎么确定

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

暑假第四次考试 冲刺Noip模拟赛4 解题报告——五十岚芒果酱

题1 韬韬抢苹果(apple) [问题描述] 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹 果.每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了一项 特殊的规则,按体重的大小来定顺序,每一轮都是先由胖的先摘(照顾胖子),每个韬韬都 是很聪明的,不会错过眼前最大的苹果.现在问题来了,一共有 n 个苹果,m 个韬韬,要你 按原顺序输出每个韬韬可以抢到的苹果的总大小. [输入格式]apple.in 第一行两个数 n,m. 接下来一行 n 个数,分