蒟蒻一枚 |

xqy2003

园龄:3年6个月粉丝:5关注:20

华中农业大学第十三届程序设计竞赛

题目链接


B

syh 喜欢猫猫,所以 zzy 为了哄 syh 睡觉,决定扮成猫猫。

给定一个长为 n 的序列 {ai} 和三个正整数 xyz,计算 i=1nj=1naiajxgcd(ai,aj)+yz 的值。答案对 109+7 取模。

如果这个问题的答案能够被正确解出,zzy 就会学猫叫。由于 zzy 正在学怎么学猫叫,所以请你告诉 syh 这个问题的答案。


赛时想到枚举 a[i] , 去找它的因子最为 gcd k , 再求aj (其中 gcd(ai,aj)=k).
将因子 k 从大到小枚举,这个 k 带来的 aj 可以预处理,不过要减去它在各个因子集合中倍数带来的 aj 影响。
在枚举因子 k 倍数的时候就卡住了。


看了看榜一佬的思想,他把 a[i]a[j] 整体看成了答案.
f[k] 代表 gcd=k 时,a[i]a[j].
之后就是类似于我们赛事的那个容斥思想了 (f[k] 不好求 , 求f[k>=i]f[k>i])


#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 1E5 + 5;
const int mod = 1E9 + 7;
int n;
int num[N];
int f[N];
void solve() {
cin >> n;
LL x , y , z;
cin >> x >> y >> z;
for (int i = 1 ; i <= n ; ++i) {
int ai;
cin >> ai;
(num[ai] += ai) %= mod;
}
for (int i = 1 ; i < N ; ++i) {
for (int j = i ; j < N ; j += i) {
(f[i] += num[j]) %= mod;
}
}
for (int i = N - 1 ; i >= 1 ; --i) {
f[i] = 1LL * f[i] * f[i] % mod;
for (int j = i + i ; j < N ; j += i) {
f[i] -= f[j];
f[i] = (f[i] % mod + mod) % mod;
}
}
LL ans = 0;
for (int i = 1 ; i < N ; ++i) {
ans += 1LL * f[i] * ((x * i + y) / z) % mod;
ans %= mod;
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T = 1;
while (T--) {
solve();
}
return 0;
}

本文作者:xqy2003

本文链接:https://www.cnblogs.com/xqy2003/p/18134363

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

蒟蒻一枚 坐标山西大学

欢迎你的到来(??);

posted @   xqy2003  阅读(18)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.

我和我的祖国 (童声版) - 李如意

词:张藜

曲:秦咏城

我和我的祖国

一刻也不能分割

无论我走到哪里

都流出一首赞歌

我歌唱每一座高山

我歌唱每一条河

袅袅炊烟 小小村落 路上一道辙

我最亲爱的祖国

我永远紧依着你的心窝

你用你那母亲的脉搏和我诉说

我的祖国和我

像海和浪花一朵

浪是那海的赤子

海是那浪的依托

每当大海在微笑

我就是笑的旋涡

我分担着海的忧愁

分享海的欢乐

我最亲爱的祖国

你是大海永不干涸

永远给我 碧浪清波 心中的歌

我最亲爱的祖国

你是大海永不干涸

永远给我 碧浪清波 心中的歌