打卡信奥刷题(3515)用C++实现信奥题 P10886 【MX-S3-T2】「FeOI Round 1」Journey

P10886 【MX-S3-T2】「FeOI Round 1」Journey

题目背景

原题链接:https://oier.team/problems/S3B


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

题目描述

小 W 最近正在学习某编程语言。

这个编程语言有个语句如下:

range(a,b,c)

这个语句表示一个序列,这个序列是这样的:

[ a , a + c , a + 2 c , ⋯   , a + k c ] [a,a+c,a+2c,\cdots,a+kc] [a,a+c,a+2c,,a+kc]

其中, k k k 是最大的满足 a + k c < b a+kc<b a+kc<b 的非负整数 k k k。例如 range(1,7,2) 表示的序列为 [ 1 , 3 , 5 ] [1,3,5] [1,3,5]

小 W 想问你一个问题:给你一个长为 n n n 的序列 g g g(下标从 1 1 1 开始),求出下列式子的值,答案模 10 9 + 7 10^9 +7 109+7

∑ a = 1 n ∑ b = a + 1 n + 1 ∑ c = 1 n ∑ i ∈ r a n g e ( a , b , c ) g i \sum_{a=1}^{n}\sum_{b=a+1}^{n+1}\sum_{c=1}^{n}\sum\limits_{i\in \mathrm{range}(a,b,c)} g_i a=1nb=a+1n+1c=1nirange(a,b,c)gi

输入格式

为了加快读入速度,我们采用以下读入方法。

读入共一行五个非负整数 n , A , B , C , g n n,A,B,C,g_n n,A,B,C,gn

其中 n n n 为序列 g g g 的长度, A , B , C A,B,C A,B,C 为生成数据的参数, g n g_n gn 为序列 g g g 的第 n n n 项。

对于序列 g g g 的第 i i i 1 ≤ i < n 1\leq i < n 1i<n)项,满足 g i ≡ A g i + 1 2 + B g i + 1 + C ( m o d 10 9 + 7 ) g_i \equiv Ag_{i+1}^2+Bg_{i+1}+C \pmod {10^9 + 7} giAgi+12+Bgi+1+C(mod109+7)

输出格式

共一行一个非负整数,为题目中所求的答案。

输入输出样例 #1

输入 #1

2 0 1 1 1

输出 #1

11

输入输出样例 #2

输入 #2

9 0 1 0 663

输出 #2

422994

输入输出样例 #3

输入 #3

20 1 0 0 998244353

输出 #3

560706529

输入输出样例 #4

输入 #4

114514 17723 134 1045 233337

输出 #4

442762986

说明/提示

【样例解释 #1】

g = [ 2 , 1 ] g=[2,1] g=[2,1](下标从 1 1 1 开始)

a n s = ∑ i ∈ r a n g e ( a , b , c ) g i ans=\sum\limits_{i\in \mathrm{range}(a,b,c)} g_i ans=irange(a,b,c)gi

a = 1 , b = 2 , c = 1 a=1,b=2,c=1 a=1,b=2,c=1 时, a n s = 2 ans=2 ans=2

a = 1 , b = 2 , c = 2 a=1,b=2,c=2 a=1,b=2,c=2 时, a n s = 2 ans=2 ans=2

a = 1 , b = 3 , c = 1 a=1,b=3,c=1 a=1,b=3,c=1 时, a n s = 2 + 1 = 3 ans=2+1=3 ans=2+1=3

a = 1 , b = 3 , c = 2 a=1,b=3,c=2 a=1,b=3,c=2 时, a n s = 2 ans=2 ans=2

a = 2 , b = 3 , c = 1 a=2,b=3,c=1 a=2,b=3,c=1 时, a n s = 1 ans=1 ans=1

a = 2 , b = 3 , c = 2 a=2,b=3,c=2 a=2,b=3,c=2 时, a n s = 1 ans=1 ans=1

答案为 ∑ a n s = 2 + 2 + 3 + 2 + 1 + 1 = 11 \sum ans=2+2+3+2+1+1=11 ans=2+2+3+2+1+1=11

【样例解释 #2】

该样例满足特殊性质 A。

【数据范围】

对于 100 % 100\% 100% 的数据: 1 ≤ n ≤ 2 × 10 7 1\leq n\leq 2\times 10^7 1n2×107 0 ≤ A , B , C , g n < 10 9 + 7 0\leq A,B,C,g_n<10^9 +7 0A,B,C,gn<109+7

测试点编号 n = n= n=特殊性质
1 1 1 1 1 1AB
2 2 2 1000 1000 1000
3 3 3 1000 1000 1000
4 4 4 5000 5000 5000
5 5 5 5000 5000 5000
6 6 6 10 4 10^4 104A
7 7 7 10 5 10^5 105A
8 8 8 10 5 10^5 105B
9 9 9 10 5 10^5 105
10 10 10 2 × 10 5 2\times 10^5 2×105A
11 11 11 2 × 10 5 2\times 10^5 2×105B
12 12 12 5 × 10 5 5\times 10^5 5×105
13 13 13 10 6 10^6 106A
14 14 14 10 6 10^6 106B
15 15 15 2 × 10 6 2\times 10^6 2×106
16 16 16 3 × 10 6 3\times 10^6 3×106
17 17 17 5 × 10 6 5\times 10^6 5×106A
18 18 18 10 7 10^7 107A
19 19 19 10 7 10^7 107B
20 20 20 1.3 × 10 7 1.3\times 10^7 1.3×107
21 21 21 1.6 × 10 7 1.6\times 10^7 1.6×107
22 22 22 2 × 10 7 2\times 10^7 2×107A
23 23 23 2 × 10 7 2\times 10^7 2×107B
24 24 24 2 × 10 7 2\times 10^7 2×107
25 25 25 2 × 10 7 2\times 10^7 2×107

特殊性质 A:保证所有 g i g_i gi 相等。

特殊性质 B:保证只有 g n ≠ 0 g_n\neq 0 gn=0

C++实现

#include<bits/stdc++.h>
using namespace std;
const int N=2e7+10,mod=1e9+7;
int n,vis[N],pr[N],m,t,a[N],f[N],b[N];
inline void get(int n){
	f[1]=1;
	for (int i=2;i<=n;i++){
		if (!vis[i]) pr[++m]=i,a[i]=1,f[i]=2;
		for (int j=1;i*pr[j]<=n;j++){
			int x=i*pr[j];
			vis[x]=1;
			if (i%pr[j]==0){
				a[x]=a[i]+1,f[x]=f[i]/a[x]*(a[x]+1);
				break;
			} 
			else a[x]=1,f[x]=f[i]*2;
		}
	}
	for (int i=1;i<=n;i++) f[i]+=f[i-1];
}
inline int read(){
	char c=getchar();int f=1;int ans=0;
	while(c<48||c>57) (c==45?f=-1:1),c=getchar();
	while(c>=48&&c<=57) ans=(ans<<1)+(ans<<3)+(c^48),c=getchar();
	return ans*f;
}
main(){
	int n=read(),A=read(),B=read(),C=read();b[n]=read();
	get(n);
	for (int i=n-1;i>0;i--)
		b[i]=(1ll*A*b[i+1]%mod*b[i+1]%mod+1ll*B*b[i+1]%mod+C)%mod;
	int ans=0;
	for (int i=1;i<=n;i++){
		int sum=0;
		sum=f[i-1];
		ans=(1ll*b[i]*(n+1-i)%mod*sum%mod+ans+1ll*b[i]*n%mod*(n+1-i)%mod)%mod;
	}
	cout <<ans;
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值