首页 > 其他分享 >Luogu P3862 数圈 题解

Luogu P3862 数圈 题解

时间:2023-11-01 21:26:43浏览次数:32  
标签:10 题解 ll times P3862 数圈 9.99

看数据范围

——题记

传送门

考虑记

\(f_i\) 表示有 \(i\) 个点的完全图的圈数

\(g_i\) 表示有 \(i\) 个点的完全图中一个点到另一个点不同路径的方案数

\(ans\) 表示答案

容易知道递推式

\[f_i=g_{i-1} \times C_{i-1}^2+f_{i-1} \]

\[g_i=g_{i-1} \times (i-2) + 1 \]

\[ans=f_{n-1}+g_{n-1}\times C_{n-2}^2 \]

因为 \(f_i\) 和 \(g_i\) 只跟 \(f_{i-1}\) 和 \(g_{i-1}\) 有关,所以使用滚动数组

然后看数据范围

\[9.99\times 10^8\le n\le 10^9 \]

我们发现,哪怕是最后一个数据范围,假如知道了 \(f_{9.99\times 10^8}\) 和 \(g_{9.99\times 10^8}\),最多只用计算 \(10^6\) 就可以算出答案(原来是这样解决的吗?太神奇了。我想了一小时才想出来

预处理就好,不用多久(用上面那个递推式计算,等一分钟就好了)

上代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=998244353;
ll T,n,f,g;
ll t1=876466444,t2=141309211;
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld",&n);
		if(n==3)
		{
			puts("0");
			continue;
		}
		if(n<=1000000)
		{
			f=1,g=2;
			for(ll i=4;i<n;i++) //注意这里假如是 int 的话会爆 int,因为下面有 (i-1)*(i-2) 
			f=(f+g*(((i-1)*(i-2)/2)%mod)%mod)%mod,g=(g*(i-2)%mod+1)%mod;
			printf("%lld\n",(f+g*(((n-2)*(n-3)/2)%mod)%mod)%mod);//同理 n 也要 long long
		}
		else
		{
			f=t1,g=t2;
			for(ll i=998999999;i<n;i++)
			f=(f+g*(((i-1)*(i-2)/2)%mod)%mod)%mod,g=(g*(i-2)%mod+1)%mod;
			printf("%lld\n",(f+g*(((n-2)*(n-3)/2)%mod)%mod)%mod);
		}
	}
	return 0;
}

标签:10,题解,ll,times,P3862,数圈,9.99
From: https://www.cnblogs.com/pengchujie/p/17804120.html

相关文章

  • Sasha and Array 题解
    SashaandArray题目大意给定一个长为\(n\)的序列\(a\),支持以下操作:\(\foralli\in[l,r],a_i\getsa_i+x\)。求\(\left(\sum\limits_{i=l}^{r}F_{a_i}\right)\bmod(10^9+7)\),其中\(F\)表示斐波那契数列,即有\(F_1=1,F_2=1,\foralli>2,F_i=F_{i-1}+F_{i-2}\)。......
  • 第四届辽宁省大学生程序设计竞赛部分题解
    2023辽宁省赛A:欢迎来到辽宁省赛题目描述小Z躺在床上看了看表,现在是13:30,2023辽宁省大学生程序设计竞赛的报名将会在14:00截止。然而不急,省赛的参赛队伍还没有向他提交名单。小Z知道,只要3分钟他就可以完成报名,完成汇款。现在他想知道,队伍要在多少分钟内......
  • [ABC326D] ABC Puzzle 题解
    题意:给定整数\(N\),字符串\(R,C\),构造满足以下条件的\(N\timesN\)矩阵:1.每一行和每一列中\(A,B,C\)各有且仅有一个。2.第\(i\)行的第一个字母等于字符串\(R\)的第\(i\)个字符。3.第\(i\)列的第一个字母等于字符串\(C\)的第\(i\)个字符。看数据范围考虑应该......
  • P4067 [SDOI2016] 储能表 题解
    [SDOI2016]储能表-洛谷题目详情-[SDOI2016]储能表-BZOJbyHydroOJ一道很好的数位dp题不过这题有一个比较有意思的性质:当\(n,m\)为\(2^k\)的形式时,最终得到的数组对每一行排序后为\(0\simm-1\)的排列,如果有的话说不定可以作为一个部分分?遇到二进制运......
  • 11月3号晚上测试题解
    3954ProblemA变量交换输出#include<stdio.h>intmain(){inta,b,c,x;scanf("%d%d%d",&a,&b,&c);//假设a,b,c分别为1,2,3;选择一个中间值进行数值替换x=a;//把a赋值给x,此时x就等于a的值为1a=c;//把c赋值给a,此时a就等于c的值为3c=b;//把b赋......
  • CF1874F Jellyfish and OEIS 题解
    题目链接不明白出题人的脑回路是不是被宇宙射线改变过/jy。题目给出了若干个区间,要我们计算满足每个区间都不是对应下标的排列的数量,正着计算不满足要求的数量是困难的,我们将其容斥,转化为钦定一些区间要求其必须满足它是对应下标的排列,在下文中,我们称这样的区间为一个约束。我......
  • 题解 P6560 [SBCOI2020] 时光的流逝
    题解P6560[SBCOI2020]时光的流逝首先考虑图上的点为\(y\)终点时,或者这个点无法继续向下走,即\(du_i=0\)时,从这个点为起点先手必败,而对于每一个有一条指向先手必败的点的边的点,显然从这个点出发都是先手必胜的,以此类推。可以考虑建反图,进行拓扑排序,转移状态。#include<q......
  • 题解 [ARC149B] Two LIS Sum
    题解[ARC149B]TwoLISSum大胆猜结论,按照\(a\)数组为关键字进行排序,求更改后\(b\)的\(LIS\)。证明:每次移动,都有\(a\)中增加一个长度,\(b\)中贡献可能为\(\{-1,0,1\}\),总体贡献为\(\{0,1,2\}\),具体为:\(b\)中排序后大数变到小数前方。\(b\)中排序后小数仍然......
  • CF1872E Data Structures Fan 题解
    CF1872E翻译请把数据加强到\(\sumn\leq10^8\)后重新思考。我们维护全局中被标记的所有点的异或和。发现对于一次\(1\)操作,相当于让答案异或上区间的\(a_i\)异或和,因为这会让被标记的点变成没被标记的,而没被标记的点会产生贡献。查询的话直接查询即可复杂度......
  • P2391 白雪皑皑 题解
    一种很新的区间染色题目传送门题目大意有\(n\)个数初始都为\(0\),有\(m\)次操作,第\(i\)次将\((i\timesp+q)\bmodn+1\)与\((i\timesq+p)\bmodn+1\)之间数都改为\(i\),问\(m\)次操作后每个数分别是多少。其中\(1\len\le10^6,1\lem\le1......