1 条题解
-
0
自动搬运
来自洛谷,原作者为

diltraser
**搬运于
2025-08-24 22:06:09,当前版本为作者最后更新于2018-11-08 18:12:44,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
很显然每个数在求和时出现的次数相等,设为动作总数为个时某个数求和时的贡献,则
试图递推,首先放式子
第一项表示动作总数为时排列数量,在之后可以放使计数++;
第二项表示排列中以/结尾的数量,在此之后会产生组合技效果;
第三项表示排列前位中的贡献;
然后经过
找规律归纳推理,可得代入进中,得
求出%,的逆元,%即可AC
Code
#include<cstdio> #include<algorithm> #include<cstring> #include<cctype> using namespace std; typedef long long ll; ll mod = 19491001; int n; char s[1000010]; int len; ll N; ll k; ll tot; ll quick_pow(ll x, int k) { ll res = 1; while(k) { if(k & 1) res = res * x % mod; x = x * x % mod; k >>= 1; } return res; } ll inv(long long x) { return quick_pow(x, mod - 2); } int main(){ char ch=getchar(); while(isdigit(ch)){ s[++len]=ch; N=(10*N+ch-'0')%mod; ch=getchar(); } scanf("%lld",&k); int i,val; for(i=1;i<=k;i++){ scanf("%d",&val); tot=(tot+val)%mod; } ll invk=inv(k); printf("%d",(N*k%mod+2*N-2)%mod*tot%mod*invk%mod*invk%mod); return 0; }
- 1
信息
- ID
- 3936
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者