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=1∑nb=a+1∑n+1c=1∑ni∈range(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 1≤i<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} gi≡Agi+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=i∈range(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 1≤n≤2×107, 0 ≤ A , B , C , g n < 10 9 + 7 0\leq A,B,C,g_n<10^9 +7 0≤A,B,C,gn<109+7。
| 测试点编号 | n = n= n= | 特殊性质 |
|---|---|---|
| 1 1 1 | 1 1 1 | AB |
| 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 104 | A |
| 7 7 7 | 10 5 10^5 105 | A |
| 8 8 8 | 10 5 10^5 105 | B |
| 9 9 9 | 10 5 10^5 105 | 无 |
| 10 10 10 | 2 × 10 5 2\times 10^5 2×105 | A |
| 11 11 11 | 2 × 10 5 2\times 10^5 2×105 | B |
| 12 12 12 | 5 × 10 5 5\times 10^5 5×105 | 无 |
| 13 13 13 | 10 6 10^6 106 | A |
| 14 14 14 | 10 6 10^6 106 | B |
| 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×106 | A |
| 18 18 18 | 10 7 10^7 107 | A |
| 19 19 19 | 10 7 10^7 107 | B |
| 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×107 | A |
| 23 23 23 | 2 × 10 7 2\times 10^7 2×107 | B |
| 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥题 P10886 【MX-S3-T2】「FeOI Round 1」Journey&spm=1001.2101.3001.5002&articleId=163841913&d=1&t=3&u=82256aa801c140f885f5ed26d793ed56)
5188

被折叠的 条评论
为什么被折叠?



