首页 > 其他分享 >2023.11.14测试

2023.11.14测试

时间:2023-11-15 09:35:59浏览次数:33  
标签:dots 14 int 2023.11 desp Gd 测试 800

\[\text{NOIP模拟赛-2023.11.14} \]

T1 简单的题

给三个数 \(n,G,L\),要求从 \(1\dots n\) 中选出一个非空子集使 \(\gcd=G\),\(\operatorname{lcm}=L\)。问方案数。同时有若干询问,给定 \(a_i\),求在包含 \(a_i\) 的前提下的方案数。

\(n,G,L\leq 10^8\),\(Q\leq 5000\)

把 \(L\) 所有因数,\(G\) 所有倍数取出来,记为 \(a_1,\dots,a_n\),\(n\) 的规模 \(\leq 800\)。把它们写作 \(Gd_1,Gd_2,\dots,Gd_n\) 的形式,现在变成从 \(d\) 里面选数,记选出的为 \(x_1,x_2\dots,x_m\),则 \(\gcd(x_1,\dots ,x_m)=1\),\(\operatorname{lcm}(x_1,\dots,x_m)=\dfrac{L}{G}\)。分解质因数变成每一位因数的指数 \(\max\) 要与 \(L\) 该位相等,指数的 \(\min\) 为 \(0\)。发现 \(\dfrac{L}{G}\) 最多 \(8\) 个质因数,可以状压

设 \(f_{i,s,t}\) 表示前 \(i\) 位的数的指数 \(\max\) 满足了 \(s\) 集合,指数 \(\min\) 满足了 \(t\) 集合的方案数。枚举 \(i\) 的贡献,则 \(f_{i,s,t}\rightarrow f_{i+1,s',t'}\)。同时 \(i\) 可以不选,\(f_{i,s,t}\rightarrow f_{i+1,s,t}\)。答案即 \(f_{n,S,T}\)

但是现在还要求必须选某个数 \(a_i\)。然后不会了……我的想法是,对于每个询问 \(a_i\),将 \(i-1\) 和 \(i+1\) 的 \(f_{,s,t}\) 记录下来,枚举超集计算贡献(不会高维前缀和),然后合并,时间复杂度 \(\mathcal{O}(800\times 3^{16})\),无法通过。后来想要是一个数 \(x\) 它没有任何一位的指数取到 \(0\),也没有取到 \(\max\),那它在转移的时候转移系数就是 \(0\),所以它的答案应该是 \(\dfrac{f_{n,S,T}}{2}\)。估计不满足这样条件的数应该不会很多,所以其它的暴力做感觉能通过 。

UPD:获得 \(80\) 分,正解就是高维前缀和,时间复杂度 \(\mathcal{O}(8\times 2^{16} \times 800)\)

code
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define LL long long
using namespace std;

bool Mbe;

const int N=800,QQ=5010,SS=(1<<8)+10;
const int MOD=998244853;

int n,G,L,des,Q,S,q[QQ],ans[N];
int a[N],d[N],m;
int p[N][10],cnt,legal[N][2];
int f[N][SS][SS],g[N][SS][SS];
map <int,int> desp;
bool isque[N];

void prework()
{
	for(int i=1; i*i<=L; i++)
	{
		if(L%i==0)
		{
			if(i%G==0 && i<=n)
				a[++m]=i;
			if(i*i!=L && (L/i)%G==0 && L/i<=n)
				a[++m]=L/i;
		}
	}
	sort(a+1,a+1+m);
	for(int i=1; i<=m; i++)
		d[i]=a[i]/G;
}

void divide(int x,int i)
{
	for(int j=2; j*j<=x; j++)
	{
		if(x%j==0)
		{
			if(i==0)
				desp[j]=++cnt;
			int id=desp[j];
			while(x%j==0)
				p[i][id]++,x/=j;
		}
	}
	if(x>1)
	{
		if(i==0)
			desp[x]=++cnt;
		p[i][desp[x]]++;
	}
}

void work(int i)
{
	for(int j=1; j<=cnt; j++)
	{
		if(p[i][j]==p[0][j])
			legal[i][0]^=(1<<j-1);
		if(p[i][j]==0)
			legal[i][1]^=(1<<j-1);
	}
}

void SOS_DP()
{
	for(int i=1; i<=cnt; i++)
		for(int s=0; s<=S; s++)
			if(!(s&(1<<i-1)))
				for(int t=0; t<=S; t++)
					for(int j=1; j<=m; j++)
						(g[j][s][t]+=g[j][s|(1<<i-1)][t])%=MOD;
	for(int i=1; i<=cnt; i++)
		for(int t=0; t<=S; t++)
			if(!(t&(1<<i-1)))
				for(int s=0; s<=S; s++)
					for(int j=1; j<=m; j++)
						(g[j][s][t]+=g[j][s][t|(1<<i-1)])%=MOD;
}

int solve(int i)
{
	int res=0;
	for(int s=0; s<=S; s++)
	{
		for(int t=0; t<=S; t++)
		{
			int ss=s|legal[i][0],tt=t|legal[i][1];
			(res+=1LL*f[i-1][s][t]*g[i+1][S^ss][S^tt]%MOD)%=MOD;
		}
	}
	return res;
}

bool Med;

int main()
{
	freopen("easy.in","r",stdin);
	freopen("easy.out","w",stdout);

	// fprintf(stderr, "%.3lfMB\n",(&Mbe-&Med)/1048576.000);

	scanf("%d%d%d%d",&n,&G,&L,&Q);
	for(int i=1; i<=Q; i++)
		scanf("%d",&q[i]);
	
	if(L%G!=0)
	{
		for(int i=0; i<=Q; i++)
			puts("0");
		return 0;
	}

	prework();

	divide(des=L/G,0);
	for(int i=1; i<=m; i++)
	{
		divide(d[i],i);
		work(i);
	}

	for(int i=1; i<=Q; i++)
	{
		int cur=lower_bound(a+1,a+1+m,q[i])-a;
		if(a[cur]!=q[i])
			continue;
		isque[cur]=1;
	}

	f[0][0][0]=1;  S=(1<<cnt)-1;
	for(int i=0; i<m; i++)
	{
		for(int s=0; s<=S; s++)
		{
			for(int t=0; t<=S; t++)
			{
				(f[i+1][s|legal[i+1][0]][t|legal[i+1][1]]+=f[i][s][t])%=MOD;
				(f[i+1][s][t]+=f[i][s][t])%=MOD;
			}
		}
	}
	g[m+1][0][0]=1;
	for(int i=m+1; i>1; i--)
	{
		for(int s=0; s<=S; s++)
		{
			for(int t=0; t<=S; t++)
			{
				(g[i-1][s|legal[i-1][0]][t|legal[i-1][1]]+=g[i][s][t])%=MOD;
				(g[i-1][s][t]+=g[i][s][t])%=MOD;
			}
		}
	}

	SOS_DP();

	for(int i=1; i<=m; i++)
	{
		if(!isque[i])
			continue;
		ans[i]=solve(i);
	}

	printf("%d\n",f[m][S][S]);
	for(int i=1; i<=Q; i++)
	{
		int cur=lower_bound(a+1,a+1+m,q[i])-a;
		if(a[cur]!=q[i])
			puts("0");
		else
			printf("%d\n",ans[cur]);
	}

	return 0;
}

标签:dots,14,int,2023.11,desp,Gd,测试,800
From: https://www.cnblogs.com/xishanmeigao/p/17833127.html

相关文章

  • 2023年11月14号(学生选课管理系统源代码)
    今天将本周一的代码进行了bug修改和完善,下面是源代码四张数据库的内容与命名:主页面:<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>选课管理系统</title></head><body><tablebgcolor=&......
  • Java Junit单元测试(基础篇)
    什么是单元测试? 单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进而检查方法的正确性目前测试方法是怎么进行的,存在什么问题?1、只有一个main方法,如果一个方法的测试失败了,其他方法测试会受到影响2、无法得到测......
  • 20231114打卡
    今天学习了数据结构练习了最小生成树算法kruskal和最短路径dijkstra和floyd算法#defineMAX10000000#include<iostream>usingnamespacestd;structGraph{ int**arc; char*vex; intvexnum; intarcnum;};structEdge{ intstart,end,weight;};Edge*cre......
  • 2023.11.14
    CLYZ联考。鉴定为FJOI。A问\(\{1,2,\dots,n\}\)有多少子集的\(\gcd=G\),\(\operatorname{lcm}=L\)。另外地,多次询问若子集包含\(x\)的方案数。答案模\(998244853\)。\(1\len,G,L\le10^8\),\(1\leq\le5000\),\(1\lex\len\)。\(\mathrm{TL}=6\mathrm{s}\)。先解决......
  • 11.14打卡
    1.最小覆盖字串(76)给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。classSolution{publicStringminWindow(Strings,Stringt){intn=s.length();......
  • 离职了14天了,准备开始找工作了
    1.面试总结一springCloud,dubbo为什么选择用springcloudspringcloud相当于一个完整的体系,能帮助开发者快速的构建分布式系统,里面的组件比dubbo多dubbo相比于springcloud来说优势在性能要好,使用的协议不一样,dubbo使用的是默认的协议dubbo协议,rmihessionherif springclo......
  • 11 14 lombok的使用和注册接口与登录接口细节
      先导入lombok的依赖,加上@Data注解  这是pojo包下的result,使用的两个注解是无参构造和有参构造controller:书写 service接口书写: serviceImol书写: 其中@Service把把该类注入到容器中,@Autowired注解是依赖注入,Md5Util是一个工具类,其中的getMD5String(string)......
  • 11.14 衔花
    垫底好心情,从我做起也只能我了昨天改的GNUK改坏了,今天重改妈的模拟赛垫了,现在完全不会计数。好多技巧都忘光光了。幸好很快就要结束了。再见呢朋友们。http://www.ccgp-hebei.gov.cn/sjz/sjz/cggg/zhbggAAAS/202311/t20231114_1910631.htmlS2新购买了三块显卡,一款古......
  • 2023.11.14 总结
    T1题意:已知\(P=10^{18}+31\)为质数且存在原根\(g=42\),记\(A_0\)为\(795484359100928850\),\(A_k=f(A_{k-1})\),其中\(0<f(x)<P\)且满足\(g^{f(x)}\equivx(modP)\),可证明这样\(f(x)\)唯一存在,每次查询一点\(f(x)\)的取值,\(1\lex\le10^5\)。事实上,此......
  • 11.14每日总结
    目中在搜索商品时,在没有搜索按钮的情况下,刚开始是写的当用户输入完成后,input框失去焦点blur事件处理,产品提议用户输入后,按enter回车键返回搜索结果。vue中失去焦点事件写法:@blurvue中enter回车键事件写法:@keyup.enter.native......