首页 > 其他分享 >《AT_abc322_g Two Kinds of Base》解题报告

《AT_abc322_g Two Kinds of Base》解题报告

时间:2023-09-30 23:56:02浏览次数:40  
标签:10 Kinds pw int Two 枚举 Base 位数 ans

好题,考场上想到做法了,没写出来,被薄纱了,记录一下。

主要是做的比较顺一下就想到了。

我们先转换一下 \(f\) 函数

\(f(S,a,b)=\sum\limits_{i=1}^k S_i\times (a^{k-i}-b^{k-i})\)

我们可以发现对于位数 \(>2\) 的,一定满足 \(a\le \frac {(x+1)}2\) ,因为如果不是的话 \(a^2-(a-1)^2=2a-1\) (当 \(b=a-1\) 时,显然是能达到的最小值),移一下项就有了。

所以我们发现当位数 \(>2\) 时, \(a\) 的实际有效位数很少,考虑分开考虑,这是经典套路,因为其实 \(a^{k-i}-b^{k-i}\) 是指数级增长,有点像进制,对于进制的题目,分开来计算是经典套路。

  • 考虑位数 \(=2\) 的情况

就是求 \(S_1\times (a-b)=x\) 的情况有多少种,枚举每个 \(x\) 的因数,考虑枚举 \(S_1\) ,枚举完之后对于 \(b<10\) 的情况暴力整整,然后对于 \(b>=10\) 的情况再直接计算就好了(但是考场上枚举了 \(a-b\) 细节没处理好寄了),因为 \(S_k\) 是可以随便填的(因为 \(a^0-b^0=0\))

这一部分时间复杂度是 \(O(10\sqrt x)\)

  • 考虑位数 \(>2\) 的情况

我们可以先枚举一下位数,因为显然位数是 \(\log x\) 级别的,然后暴力枚举 \(x\) ,再枚举有效的 \(b\) ,这部分的复杂度是一个常数极小的 \(x\sqrt x\) 。

然后如果我们再去 \(dp\) 时间复杂度承受不了,找性质。

\(1\times (a^{k}+b^{k})>min(10,b-1)(a^{k-1}-b^{k-1})\)

我们钦定右边最小值是 \(b-1\)

移一下项得到

\((a-b+1)a^{-1}-b^{k-1}\) 这个式子显然是大于 \(0\) 的,因为 \(a>b\) 。

然后如果右边最小值不是 \(b-1\) ,但是因为更大的 \(b-1\) 都没有左边大,那 \(10\) 显然也没有左边大。

那么也就是说对于前面的位数如果能填 \(x\) ,那么你就一定要填 \(x\) ,不然你后面无论填什么都凑不够前面损失的贡献,就像进制一样。

所以我们的 \(dp\) ,就转换成了一个判断问题,从 \(1\) 往 \(k\) 扫就好了。

时间复杂度 \(O(x\sqrt x\log^2 x)\) 常数极小,可以通过,当然实际上最开始的枚举位数不需要,因为对于一组 \(a,b\) ,他的可能贡献的答案位数是固定的。理论上可以做到 \(x\sqrt x\log x\) ,反正常数极小。

点击查看代码
#include<bits/stdc++.h>
#define int long long
typedef long long LL;

using namespace std;
const int MAXN=2e5+10,MODD=998244353;
LL n,x;
LL ans;
void calc(int q) {
	for(LL a=q+1+(x/q);a<=n;++a) {
		LL b=a-x/q;
		if(b>=10) break;
		ans=(ans+min(10ll,b))%MODD;
	}
	if(n-(x/q)>=10) {
		ans=(ans+(10ll*(n-(x/q)-10+1))%MODD)%MODD;
	}
}
void tp1() {
	for(int i=1;i<=x;++i) {
		if(x%i==0) {
			if(i<10) calc(i);
		}
	}
}
LL pw[MAXN][23];
void tp2() {
	for(int i=1;i<=x;++i) {
		pw[i][2]=i;
	}
	for(int i=3;i<=22;++i) { //枚举位数 
		for(int j=1;j<x;++j) {//枚举 a 
			if(j>n) break;
			LL res=1;
			for(int q=2;q<=i;++q) {
				res=res*j;
				if(res>1e13) break;
			}
			if(res>1e13) break;
			pw[j][i]=res;
			for(int q=j-1;q>=1;--q) {//枚举 b
				if(pw[j][i]-pw[q][i]>x) break;
				LL pp=x,sf=0;
				for(int w=i;w>=2;--w) {
					if(pp/(pw[j][w]-pw[q][w])>=min(10ll,q)) sf=1;
					pp%=(pw[j][w]-pw[q][w]);
				}
				if(sf||pp) continue;
				ans+=min(q,10ll);
				ans%=MODD;
			}
		}
	}
}
signed main () {
	scanf("%lld%lld",&n,&x);
	tp1();
	LL ls_ans=ans;
	tp2();
	printf("%lld\n",ans);
	return 0;
}

标签:10,Kinds,pw,int,Two,枚举,Base,位数,ans
From: https://www.cnblogs.com/ddl1no2home/p/17738430.html

相关文章

  • MapReduce和Spark读取HBase快照表
    1.概述随着大数据技术的不断发展,处理海量数据的需求变得愈发迫切。MapReduce作为一种分布式计算模型,为处理大规模数据提供了有效的解决方案。在这篇博客中,我们将探讨如何使用MapReduce框架读取快照表(SnapshotTable)的数据。快照表是一种记录某一时刻系统状态的表格,通过MapReduce......
  • java springboot项目,mybatisplus,import com.baomidou.mybatisplus.core.mapper.BaseMa
    <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.2</version><!--用版本2.1.9就不行,UserMapper里BaseMapper爆红--></dependency>我的结果是,......
  • CF957 Codeforces Round 472 (rated, Div. 2, based on VK Cup 2018 Round 2)
    CF957ATritonicIridescence如果原序列中有两个相同的字符,显然不合法。如果开头或者结尾为?,或者有两个连续的?,或者一个?两边的字符不同显然合法。否则一定不合法。#include<iostream>#include<cstdio>usingnamespacestd;constintN=105;intn;chars[N];intma......
  • CF1079 Codeforces Round 522 (Div. 2, based on Technocup 2019 Elimination Round 3
    CF1079AKitchenUtensils令\(c_i\)表示餐具\(i\)出现的数量,最小的餐具套数为\(t=\lceil\frac{\max\{c_i\}}{k}\rceil\),按照这个计算就好了。#include<iostream>#include<cstdio>#include<algorithm>usingnamespacestd;constintN=105;intn,k;inta[N]......
  • CF1072 Codeforces Round 517 (Div. 2, based on Technocup 2019 Elimination Round 2
    CF1072AGoldenPlate第\(i\)个矩形的周长为\(2(w-4(i-1))+2(h-4(i-1))-4\),枚举\(i\)求和。#include<iostream>#include<cstdio>usingnamespacestd;intn,m,k;intmain(){ scanf("%d%d%d",&n,&m,&k); intans=0; for(i......
  • CF1162 Codeforces Round 557 (Div. 2) [based on Forethought Future Cup - Final Ro
    CF1162AZoningRestrictionsAgain每个位置越高越好,暴力模拟即可。#include<iostream>#include<cstdio>usingnamespacestd;constintN=55;intn,h,m;inta[N];intmain(){ scanf("%d%d%d",&n,&h,&m); for(inti=1;i<=n;i++) a[i]=h;......
  • Linux2.1.13网络源代码学习(https://qiankunli.github.io/2022/07/04/linux_2_1_13_ne
    简介简介源码目录网络分层数据结构套接字套接字与vfssk_buff结构网络协议栈实现——数据struct和协议structlinux1.2.13接收数据收到数据包的几种情况Socket读取发送数据面向过程/对象/ioc以下来自linux1.2.13源码,算是参见Linux1.0的学习笔记。源码目......
  • JavaScript下载base64位文件
    1/**2*下载文件3**/4functiondownloadExcel(base64Data){5varmyBlob=this.base64toBlob(base64Data);6varmyUrl=URL.createObjectURL(myBlob);7varlink=document.createElement("a");8......
  • [NSSCTF 2nd]MyBase
    思路:IDA打开,发现有符号表,还贴心的备注了Base64加密。仔细一看也确实是这样。拿base64表直接丢到赛博厨子,太棒了,没有结果。怀疑是不是趁我睡着了改了我的Base64表,直接下断点动调,不调不要紧,一调吓一跳,Base64表在每次循环的时候都会变,但是加密用的表一定是相同的,那就记录每一次的表,......
  • CNN -- Simple Residual Network
    Smiling&Weeping ----我爱你,从这里一直到月亮,再绕回来说明:1.要解决的问题:梯度消失2.跳连接,H(x)=F(x)+x,张量维度必须一致,加完后再激活。不要做pooling,张量的维度会发生变化 1#先是1个卷积层(conv,maxpooling,relu),然后Res......