2019.8.21模拟测试

本文深入探讨了算法竞赛中常见的数学序列分析与动态规划问题解决策略,通过实例讲解如何运用等比数列和三进制数压缩技巧进行高效计算,特别关注了数据范围处理和优化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

T1 sequence

ummmmm,结论推错很棒哟。。。。

迭代几次可以得到一个等比数列,那么b就是一个一次常量,若|a|<1只会无限接近于某个值而无法达到无穷大。

然后就是a=-1,a=0,a+b=1的时候非法

我太蔡了

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL x=1e9;

LL a,b;

int main(){
	while(scanf("%lld%lld",&a,&b)!=EOF){
		if(a==x){
            if(!b)  puts("no");
            else  puts("yes");
        }else{
            if(abs(a)<=x||a+b==x)  puts("no");
            else  puts("yes");
        }
	}
}

T2 单词

算到是个dp,但没想到压维QAQ

整个串因为n*m<=1e5,所以当m>12时可以直接暴力n^2m做法,m<=12的时候可以考虑将整个串压成一个三进制数,dp[i][j]表示串为i有j个相同的对数。

显然有初始串dp[i][m]+=1,然后一位一位修改,每次修改一个位置dp[j][k-1]+=dp[i][k],最后统计一下即可。

(数据范围搞错调了半天过艹

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=531441;
const LL MAXP=21;

LL n,m;
string s[100010];
LL ans[100010];
LL f[MAXN][MAXP],g[MAXN][MAXP];
LL mi[MAXP],exist[MAXN];

void pre(){
	mi[0]=1;
	for(LL i=1;i<=m;++i)  mi[i]=mi[i-1]*3;
	for(LL i=1;i<=n;++i)  cin>>s[i];
	for(LL i=1;i<=n;++i){
		LL now=0;
		for(LL j=0;j<m;++j){
			now*=3;
			now+=s[i][j]-'x';
		}
		++exist[now];
	}
}

void solve(){
	pre();
	for(LL i=0;i<mi[m];++i)  g[i][m]=exist[i];
	for(LL i=0;i<m;++i){
		memcpy(f,g,sizeof(f));
		for(LL j=0;j<mi[m];++j){
			LL tmp1=(j/mi[i])%3,tmp2=j-tmp1*mi[i];
			for(LL t=0;t<mi[i]*3;t+=mi[i]){
				if(t!=tmp1*mi[i]){
					for(LL p=m-i;p<=m;++p)  f[tmp2+t][p-1]+=g[j][p];
				}
			}
		}
		memcpy(g,f,sizeof(g));
	}
	for(LL i=0;i<mi[m];++i){
		for(LL p=0;p<=m;++p){
			ans[p]+=exist[i]*g[i][p];
		}
	}
	ans[m]-=n;
	for(LL i=0;i<=m;++i)  cout<<ans[i]/2<<'\n';
}

int main(){
	scanf("%lld%lld",&n,&m);
	if(m<=12){
		solve();
	}
	else{
		for(LL i=1;i<=n;++i)  cin>>s[i];
		for(LL i=1;i<=n;++i){
			for(LL j=1;j<i;++j){
				LL cnt=0;
				for(LL k=0;k<m;++k)  if(s[i][k]==s[j][k])  ++cnt;
				++ans[cnt];
			}
		}
		for(LL i=0;i<=m;++i)  cout<<ans[i]<<'\n';
	}
}

T3 

这个结论易证可还行

wsm出现了LCT这种东西

咕咕咕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值