6.3 考试修改+总结

今天下午考试被FFT和数论题目翔了一脸QAQ

做的是Newscafe杯的题目

第一题 异化多肽

显然构造多项式f

答案是f+f^2+f^3……

化简一下得1/(1-f)

之后多项式求逆即可

考试的时候推了好久的多项式求逆的式子(感觉自己什么都忘光了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#define G 5
using namespace std;

typedef long long LL;
const int maxn=300010;
const int mod=1005060097;
int n,m,k,N,L;
int A[maxn],B[maxn];
int rev[maxn];

void read(int &num){
	num=0;char ch=getchar();
	while(ch<‘!‘)ch=getchar();
	while(ch>=‘0‘&&ch<=‘9‘)num=num*10+ch-‘0‘,ch=getchar();
}
int pow_mod(int v,int p){
	int tmp=1;
	while(p){
		if(p&1)tmp=1LL*tmp*v%mod;
		v=1LL*v*v%mod;p>>=1;
	}return tmp;
}
void FFT(int *A,int n,int flag){
	for(L=0;(1<<L)<n;++L);
	for(int i=0;i<n;++i)rev[i]=rev[i>>1]>>1|((i&1)<<(L-1));
	for(int i=0;i<n;++i)if(i<rev[i])swap(A[i],A[rev[i]]);
	for(int k=2;k<=n;k<<=1){
		int mk=(k>>1);
		int wn=pow_mod(G,flag==1?(mod-1)/k:(mod-1)-(mod-1)/k);
		for(int i=0;i<n;i+=k){
			int w=1;
			for(int j=0;j<mk;++j){
				int x=A[i+j],y=1LL*A[i+j+mk]*w%mod;
				A[i+j]=x+y;if(A[i+j]>=mod)A[i+j]-=mod;
				A[i+j+mk]=x-y;if(A[i+j+mk]<0)A[i+j+mk]+=mod;
				w=1LL*w*wn%mod;
			}
		}
	}
	if(flag==-1){
		int inv=pow_mod(n,mod-2);
		for(int i=0;i<n;++i)A[i]=1LL*A[i]*inv%mod;
	}return;
}
void Get_inv(int n){
	if(n==1){
		B[0]=pow_mod(A[0],mod-2);
		return;
	}
	int now=(n>>1);
	Get_inv(now);
	static int tmp[maxn];
	for(int i=0;i<now;++i)tmp[i]=A[i];
	FFT(tmp,n,1);FFT(B,n,1);
	for(int i=0;i<n;++i)B[i]=1LL*B[i]*(2-1LL*tmp[i]*B[i]%mod+mod)%mod;
	FFT(B,n,-1);
	memset(B+now,0,sizeof(int)*now);
}

int main(){
	freopen("polypeptide.in","r",stdin);
	freopen("polypeptide.out","w",stdout);
	read(n);read(m);
	for(int i=1;i<=m;++i){
		read(k);
		if(k<=n)A[k]++;
	}A[0]--;if(A[0]<0)A[0]+=mod;
	for(N=1;N<=n;N<<=1);N<<=1;
	Get_inv(N);
	int ans=-B[n];
	ans=(ans%mod+mod)%mod;
	printf("%d\n",ans);
	return 0;
}

第二题正解是用圆周卷积优化计算过程,也要写FFT

但是考试的时候没有看出来,于是就手写了一发bitset

结果压位大法好,暴力出奇迹

开O2的情况A掉了全部的数据QAQ

然而至今不能看懂题解

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define fastcall __attribute__((optimize("-O3")))
#define IL __inline__ __attribute__((always_inline))
using namespace std;

typedef long long LL;
const int maxn=100010;
int m,n,blo,k,lim,QAQ,TAT;
int ans=0x7fffffff;
char s[maxn];
LL A[maxn],B[maxn],S;
int L[maxn],R[maxn];
int Ans[maxn];
int Num[2000010];
int Q[maxn];

fastcall IL int Get_Num(LL v){
	int sum=Num[v&lim];v>>=20;
	sum+=Num[v&lim];v>>=20;
	sum+=Num[v&lim];return sum;
}
fastcall IL void check(int S){
	int sum=Get_Num(S);
	int A=(S>>(m+1)&1),B=(S>>m&1);B^=1;
	int tmp=(S&QAQ);
	int now=(2*B-1)*tmp%n;
	if(now<0)now+=n;
	if(A==0)sum+=Ans[now];
	else sum+=(n-Ans[now]);
	if(sum<ans)ans=sum;
}

int main(){
	freopen("virus.in","r",stdin);
	freopen("virus.out","w",stdout);
	scanf("%d%d",&m,&n);blo=60;
	k=(n%blo==0?n/blo:n/blo+1);lim=(1<<20)-1;QAQ=(1<<m)-1;
	for(int i=0;i<(1<<20);++i)Num[i]=Num[i>>1]+(i&1);
	scanf("%s",s+1);
	for(int i=1;i<=k;++i)L[i]=(i-1)*blo+1,R[i]=min(n,i*blo);
	for(int i=1;i<=k;++i){
		for(int j=L[i];j<=R[i];++j)A[i]=A[i]<<1|(s[j]-‘0‘);
	}
	scanf("%s",s+1);
	for(int i=1;i<=k;++i){
		for(int j=L[i];j<=R[i];++j)B[i]=B[i]<<1|(s[j]-‘0‘);
	}
	for(int i=0;i<n;++i){
		int now=0;
		for(int j=1;j<=k;++j)now+=Get_Num(A[j]^B[j]);
		Ans[i]=now;now=(A[k]&1);
		for(int j=1;j<=k;++j){
			int tmp=(A[j]&1);
			int len=R[j]-L[j];
			A[j]>>=1;
			if(now)A[j]|=(1LL<<len);
			now=tmp;
		}
	}
	int up=(1<<(m+2));
	for(int i=0;i<up;++i)check(i);
	printf("%d\n",ans);
	return 0;
}

第三题是个数论题

推导的式子很长

最后推导的结论是R(i)+i是积性的

然后就很好搞了QAQ

至于式子嘛,明天再补上(挖坑ing)(其实是因为并不会用编辑器写公式)

吐槽一下std,花式整数溢出啊,导致造的数据都是错的

考试的时候没有看出那个性质,于是只能写O(n^2)的暴力

正准备分块打表的时候吕老师问我做完了没有,我想了想反正分块打表也没有什么意思

就直接拿到数据测了QAQ

如果分块打表的话这道题目是50分QAQ直接暴力是20分

(然而正确的数据其实只有5个)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;

const int maxn=1000010;
const int mod=1005060097;
typedef long long LL;
LL n,ans,inv;
int mu[maxn];
int p[maxn],cnt=0;
bool vis[maxn];

LL pow_mod(LL v,int p){
	LL tmp=1;
	while(p){
		if(p&1)tmp=tmp*v%mod;
		v=v*v%mod;p>>=1;
	}return tmp;
}
void Get_Prime(){
	mu[1]=1;
	for(int i=2;i<=1000000;++i){
		if(!vis[i]){
			p[++cnt]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=cnt;++j){
			if(1LL*i*p[j]>1000000)break;
			int ip=i*p[j];
			vis[ip]=true;
			if(i%p[j]==0)break;
			mu[ip]=-mu[i];
		}
	}return;
}
LL Get_mod(LL n){return n%mod;}
LL Get_ans(LL n){
	LL la,sum=0;
	for(LL i=1;i<=n;i=la+1){
		LL now=n/i;
		la=n/now;
		sum=sum+Get_mod(la+i)*Get_mod(la-i+1)%mod*inv%mod*Get_mod(n/i)%mod;
		if(sum>=mod)sum-=mod;
	}return sum;
}

int main(){
	freopen("function.in","r",stdin);
	freopen("function.out","w",stdout);
	scanf("%lld",&n);
	Get_Prime();inv=pow_mod(2LL,mod-2);
	int lim=(int)(sqrt(n));
	for(int i=1;i<=lim;++i){
		ans=ans+1LL*mu[i]*i*Get_ans(n/i/i)%mod;
		if(ans<0)ans+=mod;
		if(ans>=mod)ans-=mod;
	}
	ans=ans-Get_mod(n)*Get_mod(n+1)%mod*inv%mod;
	if(ans<0)ans+=mod;
	if(ans>=mod)ans-=mod;
	printf("%lld\n",ans);
	return 0;
}

明天就要去thusc报道了

希望自己能有个好成绩吧

感觉自己还是学的太少,写的太少,想的太少

以后不能继续颓下去了QAQ

时间: 2024-10-13 13:14:19

6.3 考试修改+总结的相关文章

5.28 考试修改+总结

今天又是一个悲伤的故事,所有排名比我高的人第一题都A了 而我第一题爆零了 但是开心的事情是:第一题没有说是简单图,所以题解是错的 不管怎么样,将错就错吧 今天下午断网了,所以这时候才写blog 第一题 由于题目中没有给出欧拉图的概念,所以我完全不知道它在说啥,于是就爆零了 然后欧拉图就是存在欧拉回路的简单图,具有以下特点: 1.联通 2.度数都是偶数 显然我们将错就错看题目的话,把欧拉图数目*(n*(n-1)/2+1)就可以得到答案了 然后我们很容易知道度数均为偶数的图的数目是2^((n-1)*

6.15 考试修改+总结

昨天考崩了QAQ 几乎写全了暴力分,然而并没有什么卵用 因为只要A掉一道题就比我分高了,比我分高的也至少A掉了一道题QAQ 感觉到一丝淡淡的忧桑 貌似THUSC最后听讲课的那些人几乎都A了两题 看来我的THUSC果然只是RP好啊 第一题 显然选色数最少的颜色,设颜色数为m 考虑存在某个点的方案数,设这个点到k距离i个点 则方案数为(n-1-i)!/ ((m-i)!*j!*k!……) j,k等是其他颜色的色数 总方案也是非常好算的,这样我们就可以计算每个点对于期望的贡献了 这样做是O(n^2)的

5.26 考试修改+总结

论写5K+的代码在只有样例的条件下都可以调对 由此可见,勇气才是成功的关键 先放题解吧 第一题上午写的暴力不小心忘记题目换根之后还会染色了 然后就挂成了5分QAQ 有很大的部分分是SDOI染色,还有一部分是旅行 但是考试犯懒没有写 很容易发现任何一种颜色在树上都是连续的一段 那么我们不妨这么定义,如果一条边两端颜色不相同,我们定义为虚边,会对子树每个答案产生+1的贡献 如果两端颜色相同,我们定义为实边,不会产生贡献 不难发现,这样定义后的实边和虚边的性质和LCT的定义是一样的 我们考虑使用LCT

6.11 考试修改+总结

第三题至今没敢写,感觉好恐怖QAQ 今天考得好糟糕 第一题只写了10分的暴力+(k=1)20分的网络流 后来题解告诉我k>1的时候可以分治到k=1,每层分治解决方法是同k=1的 考试的时候没有注意到2^k这个比较神奇的可以分治的性质 而且自己考场上丝薄了,没有发现因为是二分图可以直接跑欧拉回路的性质,而是裸套网络流模型 第二题其实已经接近想出了题解 自己考试的时候成功证明了暴力的复杂度是线性的 但是没有想到如何寻找0-1对,然后就只能暴力用Splay维护1所在的位置了 默默祈祷数据不要太卡我的做

6.10 考试修改+总结+颓废记

昨天晚上得到了非常不爽的消息,zcg要去给高一讲课,而我并不能去 虽然什么事情并不能都顺着我的心意来吧,但是这件事情真是让人越想越不痛快 要知道,我从去年就一直期待着给高一讲课呢 所以今天考试非常不开心,一般这个时候我会选择爆零的 但是想了想觉得爆零太难看,就看了看好像第一题可做 在教学楼里颓废了好久然后吃了点东西,用最后的时间码完了第一题 (反正二.三题我没看出来怎么做,所以暴力也不想写了 然后惊讶的是,只有第一题程序的窝rank1了QAQ 先放题解吧 第一题: 首先我们注意到转置的实质是某个

5.27 考试修改+总结

这是一个悲伤的故事 上午写manacher的时候往里面加#号,然后统计有效字符的个数 然后我就开始模拟,一个长度为6的串我都能数错有多少个有效字符 我把2个字符数成了3个!然后暴力就挂掉了5分.. 为什么这几天的暴力总是会挂掉,真是奇怪(看来是最近自己内心不太稳了 (大概是被那个梦吓得吧QAQ) 今天又A了两道题目,感觉天天都是两道正解+挂掉的暴力QAQ 先放题解吧 第一题是之前数位DP坑掉的题目,然后今天尝试着写了写,感觉不是很难 但是并不是用数位DP做的 先考虑加密的情况,我们只需要统计每一

6.19 考试修改+总结

QAQ 又是一套水题集合 然后忧伤的故事是老师把时间调到了四个小时半 我又因为想要出道题花了半个小时写了一些其他的东西 然后最后没有写完题!QAQ 不然第三题可能多拿点分 上午的时候把所有题目的正解都想了出来 唯一美中不足的是自己想的第三题是O(n^4*300)的是时间复杂度 实际上离散化区间之后只会有n个区间,时间复杂度就是O(n^5)了QAQ 先说题解把 第一题 决战圆锥曲线 显然给定你的那个函数a*x+b*y+c*x*y对于x,y是相对等价的 又因为题目的输入具有随机性,显然可以通过维护线

5.25 考试+修改

论改题只用两分钟的速度QAQ 其实就是换了个数组名字,加上加了一句话 第一题: 首先考虑k=1的情况,考虑构造转移矩阵A ans*(A^0+A^1+……+A^(n-1)) 然后括号里的式子等比数列求和一下 是(A^0-A^n)/(A^0-A^1) 涉及到除法,手动矩阵求逆就可以了 然后这个式子就变成了一个矩阵 我们考虑k>1的情况,发现扩维不过就是又乘了一次这个矩阵 然后把这个矩阵自乘k次即可 (考试的时候犯傻,没有想到k>1的时候直接自乘k次就可以了,下午加了一句话就A了) #include

6.1 考试修改+总结

QAQ 终于回到衡中了,昨天做了一个晚上的火车,所以没来的及补题解 Em 儿童节快乐,撒花~~ 第一题 NOIP难度?提到国王游戏都提醒你怎么做了 直接裸上排序不等式化简一下就可以了 具体化简过程就不再赘述了 #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; typedef