2016广东省省赛H题

题意:计算:

∑i=1n∑j=1mi2j2gcd(i,j)

(时限1000ms)

input:

T(t<=1000),接下来t行,m,n(n,m<1e6).


题目难点在于多了i,j的平方,由对称性,设n < m,可以这样化简:

=====d′=kd===∑i=1n∑j=1mi2j2gcd(i,j)∑i=1n∑j=1m∑d|i,d|ji2j2d[(id,jd)=1]∑d=1n∑i=1?nd?∑j=1?md?i2j2d5[(i,j)=1]∑d=1n∑i=1?nd?∑j=1?md?i2j2d5∑d′|i,d′|jμ(d′)∑d=1n∑d′=1?nd?∑i=1?ndd′?∑j=1?mdd′?i2j2d′4d5μ(d′)∑k=1n∑d|k∑i=1?nk?∑j=1?mk?i2j2k4dμ(kd)∑k=1n∑i=1?nk?∑j=1?mk?i2j2k4(μ?Id)∑k=1n∑i=1?nk?∑j=1?mk?i2j2k4?(k)∑k=1nk4?(k)(∑i=1?nk?i2)(∑j=1?mk?j2)(1)(2)(3)

推导到这里就可以解决了。

k4?(k)这部分可以打表求前缀和,∑?nk?i=1i2,∑?mk?j=1j2这部分打表或者用平方和公式。对于固定的n,?nk?共有O(n??√)个取值,所以总复杂度是O(n??√+m??√)


(2)式中符号*代表卷积,Id函数代表Id(n)=n;他们的卷积是?(n),下面给出证明:

由于μ,Id都是积性函数,所以他们卷积也是积性函数.

令n=∏si=1pkii那么:

∑d|ndμ(nd)=∏i=1s(∑j=0kipjiμ(pkiipji))=∏i=1s(pkii?pki?1i)=?(n)

对比(1),(3)式子,感觉很相似,可是在推导过程从莫比乌斯反演然后卷积才得出欧拉函数,感觉是绕了一下,不知有没有更好的推导方法。

后来发现原来第一步可以这样化简:

=∑i=1n∑j=1mi2j2gcd(i,j)∑i=1n∑j=1mi2j2∑k|gcd(i,j)?(k)

接着就有后面了。。。捂脸

这里简单补一个证明:

∑k|n?(k)=n

?(n)是积性函数,同样设n=∏si=1pkii

那么有:

∑k|n?(k)=∏si=1∑kij=0?(pji)=∏si=1(1+∑kij=1(pji?pj?1i))=∏si=1pkii=n

所以其实对于gcd的某些问题,用欧拉函数处理要比反演要优。mark。

相关代码:

const int maxn = 1000006;
int prime[maxn];
int phi[maxn];
void getP();//欧拉函数打表,之后要和i^4相乘再求前缀和
int sum2[maxn];//∑i^2

int main()
{
    //...
    int ans=0;
    if(n>m) swap(n,m);
    for(int i=1,j;i<=n;i=j+1)
    {
        j=min(m/(m/i),n/(n/i));
        ans+=(phi[j]-phi[i-1])*sum2[m/i]*sum2[n/i];//这里还没考虑溢出
        ans%=mod;
    }
    //...
}
时间: 2024-10-21 15:01:56

2016广东省省赛H题的相关文章

HDUOJ-------2493Timer(数学 2008北京现场赛H题)

Timer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 445    Accepted Submission(s): 90 Problem Description Recently, some archaeologists discovered an ancient relic on a small island in the Pa

ACM-ICPC 2018徐州网络赛-H题 Ryuji doesn&#39;t want to study

C*M....死于update的一个long long写成int了 心累 不想写过程了 ******** 树状数组,一个平的一个斜着的,怎么斜都行 题库链接:https://nanti.jisuanke.com/t/31460 #include <iostream> #include <cstring> #define ll long long #define lowbit(x) (x & -x) using namespace std; const int maxn =

HDU 5880 Family View (2016 青岛网络赛 C题,AC自动机)

题目链接  2016 青岛网络赛  Problem C 题意  给出一些敏感词,和一篇文章.现在要屏蔽这篇文章中所有出现过的敏感词,屏蔽掉的用$'*'$表示. 建立$AC$自动机,查询的时候沿着$fail$指针往下走,当匹配成功的时候更新$f[i]$ $f[i]$表示要屏蔽以第$i$个字母结尾的长度为$f[i]$的字符串. 原文地址:https://www.cnblogs.com/cxhscst2/p/8452147.html

哈尔滨理工大学2016新生赛H题

陈月亮最喜欢的季节就是冬天了,这不看着窗外飘起了雪花,陈月亮开心的跑出屋来看雪.但是迷迷糊糊的陈月亮不知道自己是在做梦还是真的下起了雪.突然她想起了一句话,在真实世界中是没有两片一样的雪花的.于是你的任务就是比较这场雪中的所有雪花,如果出现了两朵完全一致的雪花,则证明陈月亮是在梦中. 每朵雪花用六个整数表示,范围在(1 – 10000000)之间,表示雪花六个花瓣的长度,六个整数的先后出现顺序可能是顺时针顺序也可能是逆时针顺序,并且可能是从任意一个花瓣开始的.比如说对同一个花瓣,描述方法可能是1

2016年 河南工业大学校赛 H题.ch追妹

ch追妹 时间限制: 2 秒  内存限制: 128 MB  |  提交: 241  解决: 119 题目描述 n个点的一张无向图,ch站在a点,ch要追的妹子站在b点.r_clover为了让ch安心训练,要阻止ch追妹.ch每走一步,r_clover就会挖断一条路.ch和r_clover均采用最优策略,问ch能不能追到妹子 输入 第一行为数据组数T(T≤10). 每组数据的第一行为四个数 n,m,a,b(1≤a,b≤n≤20; 1≤m≤80),分别表示点数,边数,ch的位置,妹子的位置. 之后m

青岛理工交流赛 H题 素数间隙

13110581088注销 素数间隙 Time Limit: 1000MS Memory limit: 262144K 题目描述 Neko猫是一个很喜欢玩数字游戏的会说话的肥猫,经常会想到很多很好玩的数字游戏,有一天,它想到一个叫做素数间隙的游戏.据Neko猫的定义,素数间隙是两个相邻素数p和q组成的开区间[p, q),所以素数间隙的长度就是q-p. 例如7和11在素数表里是两个相邻的素数,所以7和11的素数间隙的长度为11-7,为4. 现在Neko猫会给你很多个正整数K(1<K≤1299710

2017CCPC中南地区赛 H题(最长路)

题目地址:202.197.224.59/OnlineJudge2/ 来自湘潭大学OJ,题号:1267. 这里用到了一个树的直径(树中的最长边)的结论:当你找到一棵树的最长边后,这个树中所有点的最长边必定和这条边的两个端点相连.下面给出证明: 设这条最长边的两个端点分别为B和E: 1.当选择的任意点M在这条最长边上时:如果此时还存在另一个点T,使得MT > max{MB,ME}.则:MT + min{MB,ME} > max{MB,ME} + min{MB,ME} = BE这与题目假设相矛盾.

HDU 5886 Tower Defence(2016青岛网络赛 I题,树的直径 + DP)

题目链接  2016 Qingdao Online Problem I 题意  在一棵给定的树上删掉一条边,求剩下两棵树的树的直径中较长那的那个长度的期望,答案乘上$n-1$后输出. 先把原来那棵树的直径求出来.显然删掉的边不是这条直径上的边,那么这时答案就是这条直径的长度. 否则就是直径的某个端点到某一个点(要求连通)的距离的最大值. 在整条链上做两次$DP$之后枚举取较大值即可. #include <bits/stdc++.h> using namespace std; #define r

ACM-ICPC 2018青岛网络赛-H题

把这题的每个点分成两种情况看,如果是从这个点开始,0算作2,1算作1,如果是中间点或者是结束点,如果和前面的相同看作2,不相同看作1 #include <iostream> #include <string> #include <string.h> using namespace std; int main() { ios::sync_with_stdio(false); int t; cin >> t; while (t--) { int a, b; st