首页 > 其他分享 >[CF1895F] Fancy Arrays

[CF1895F] Fancy Arrays

时间:2023-11-13 16:13:54浏览次数:32  
标签:return CF1895F Arrays void Fancy i64 int ans mod

先把存在性容斥一下。变成 \([0,\infty]\) 减去 \([0,x-1]\) 和 \([x+k,\infty]\)。

\([0,x-1]\) 的答案显然可以矩阵快速幂 \(\mathcal O(x^3\log n)\) 求。考虑剩下两个。注意到两个单拎出来都不好求,所以直接求这两个的差。

注意到限制在于相邻项的差,于是我们去枚举差分数组,共有 \((2k+1)^{n-1}\) 种,然后考虑第一项,具体推导可以看八云蓝的题解,感性理解一下就是,\(p\) 在 \([0,\infty]\) 中的地位和 \(p+x+k\) 在 \([x+k,\infty]\) 中的地位是一样的,于是两者之差只有 \(x+k\) 项,于是答案就是 \((x+k)(2k+1)^{n-1}\)。时间复杂度 \(\mathcal O(Tx^3\log n)\)。

#include <bits/stdc++.h>
#define pb emplace_back
#define fir first
#define sec second

using i64 = long long;
using pii = std::pair<int, int>;

constexpr int maxn = 40 + 5;
constexpr int mod = 1e9 + 7;
void add(int& x, int y) { if ((x += y) >= mod) x -= mod; return ; }
void sub(int& x, int y) { if ((x -= y) < 0) x += mod; return ; }
int inc(int x, int y) { return (x + y) >= mod ? (x + y - mod) : (x + y); }
int dec(int x, int y) { return (x - y) < 0 ? (x - y + mod) : (x - y); }
int power(int x, int y) {
	int ans = 1;
	for (; y; y >>= 1, x = (i64)x * x % mod) if (y & 1) ans = (i64)ans * x % mod;
	return ans;
}
void chkmin(int& x, int y) { if (y < x) x = y; return ; }
void chkmax(int& x, int y) { if (y > x) x = y; return ; }
void chkmin(i64& x, i64 y) { if (y < x) x = y; return ; }
void chkmax(i64& x, i64 y) { if (y > x) x = y; return ; }
int n, k, x;

struct matrix {
	int g[maxn][maxn];
	matrix() { memset(g, 0, sizeof(g)); }
	void clr() { memset(g, 0, sizeof(g)); return ; }
	void init() { for (int i = 0; i < x; ++i) g[i][i] = 1; return ; }
	matrix operator * (const matrix& p) const {
		matrix z;
		for (int i = 0; i < x; ++i)
			for (int k = 0; k < x; ++k)
				for (int j = 0; j < x; ++j)
					add(z.g[i][j], (i64)g[i][k] * p.g[k][j] % mod);
		return z;
	}
} F, G;

matrix power(matrix x, int y) {
	matrix ans; ans.init();
	for (; y; y >>= 1) {
		if (y & 1) ans = ans * x;
		x = x * x;
	}
	return ans;
}

void work() {
	scanf("%d %d %d", &n, &x, &k);
	int ans = (i64)(x + k) * power(2 * k + 1, n - 1) % mod;
	F.clr(); G.clr();
	for (int i = 0; i < x; ++i)
		F.g[0][i] = 1;
	for (int i = 0; i < x; ++i)
		for (int j = 0; j < x; ++j)
			if (abs(i - j) <= k) G.g[i][j] = 1;
	F = F * power(G, n - 1);
	for (int i = 0; i < x; ++i)
		sub(ans, F.g[0][i]);
	printf("%d\n", ans);
	return ;
}

int main() {
	int T; scanf("%d", &T);
	while (T--) work();
	return 0;
}

标签:return,CF1895F,Arrays,void,Fancy,i64,int,ans,mod
From: https://www.cnblogs.com/663B/p/17829371.html

相关文章

  • [V8] Holey Arrays
    Whatisholeyarray:anarraywithhole(s)constarray=[1,2,,3]Whythisisaproblem?Shouldarray[2]tobeundefined?Yesandno..normallyitis undefined,butbeforethat,VMhasbeencheck Array.prototypetosee Array.prototype["2"]whethe......
  • C. Serval and Toxel's Arrays 组合数学
    题目链接......
  • 线程安全集合(JDK1.5之前和之后)、CopyOnWriteArrayList、CopyOnWriteArraySet
    JDK1.5之前JDK1.5之前:Collections.synchronizedList JDK1.5之后CopyOnWriteArrayList   CopyOnWriteArraySet    ......
  • 关于Java使用Arrays类的equals()函数比较两个数组是否相等功能的实战
    关键词:文件流问题:二进制流文件丢失解决方法:java.util.Arrays.equals(byte1[],byte2[])分析:Arrays.equals()函数比较的是数组的内容而不是引用。也就是说,只有数组的元素内容相同,并且顺序也相同,才会返回true。      如果数组的元素内容相同但顺序不同,或者数组的引用......
  • [题解]CF1223F Stack Exterminable Arrays
    CCF出的原题观摩一下。思路首先可以用一个Trie来维护。在这里对本文中的一些变量做一下说明。\(p\)表示当前维护的Trie中,指向的元素编号。\(t_i\)表示在Trie中编号为\(i\)的元素在原序列中的值。\(f_i\)表示在Trie中编号为\(i\)的元素在Trie中的父......
  • Stack Exterminable Arrays
    prologueCSPS2023T2原题,什么成分我就不多说了。(考场上没写出来的菜鱼,想到栈了然后算法假了,寄)analysis(虽然这样不对,但是我还是想撇一下我的错解)错解我们开一个栈,每一个元素进来看和栈顶元素一样不一样,如果不一样,就入栈,否则就\(ans+cnt\),\(cnt\)表示我们的栈有多少次是空......
  • B. Friendly Arrays
    B.FriendlyArrays依据异或特性,如果n为偶数,单调递减:与b[i]|越多越小反之递增点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;#defineLLlonglonginta[N],b[N];voidsolve(){ intn,m; cin>>n>>m; if(n%2==0){ int......
  • Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法
    Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,此处测试代码如下,这里使用add方法:1publicclassmain{2publicstaticvoidmain(String[]args){3int[]num={1,2,3};4Listlist=Arrays.asList(num);5list.add(4);......
  • 无涯教程-Arduino - Multi-Dimensional Arrays函数
    具有二维的数组(即下标)通常表示由以行和列排列的信息组成的值表。intb[2][2]={{1,2},{3,4}};这些值按大括号按行分组,因此,1和2分别初始化b[0][0]和b[0][1],而3和4分别初始化b[1][0]和b[1][1],如果给定行的初始化程序不足,则将该行的其余元素初始化为0。因此......
  • Arrays.asList() 和 Collections.singletonList()
    Collections.singletonList()  创建不可变List,只包含单个元素,List容量始终为1;  Arrays.asList()  快速创建List,但创建的列表是不可变的,不可调用add方法;......