[CCPC2019 ONLINE]E huntian oy

题意

http://acm.hdu.edu.cn/showproblem.php?pid=6706


思考

打表出奇迹。

注意到这个式子有一大堆强条件限制,最后化为:

$$\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}{|i-j|*[(i,j)==1]}$$

考虑莫比乌斯反演:

$$\sum_{i=1}^{n}\sum_{j=1}^{n}{|i-j|}$$

$$=\sum_{i=1}^{n}\sum_{j=1}^{n}{|i-j|}\sum_{d|i,d|j}{\mu(d)}$$
$$=\sum_{d=1}^{n}{\mu(d)*d*\sum_{i=1}^{\frac{n}{d}}\sum_{j-1}^{\frac{n}{d}}1}$$
$$=\sum_{d=1}^{n}{\mu(d)*d*F(\frac{n}{d})}$$

F是容易计算的。也就是说,我们要算出$\sum_{d=1}^{n}{\mu(d)*d}$在根号个点处的前缀和。杜教筛即可。

对于小于等于$10^6$的情况,线性筛预处理。


代码

  1 #pragma GCC optimize 2
  2 #include<bits/stdc++.h>
  3 #define mod 1000000007
  4 #define G2 500000004
  5 #define G3 333333336
  6 #define G6 166666668
  7 using namespace std;
  8 typedef long long int ll;
  9 const int maxn=1E6+5;
 10 ll T,n,m;
 11 ll size,prime[maxn],mu[maxn],sum[maxn];
 12 ll F[maxn],f[maxn];
 13 int TOT;
 14 int used[maxn];
 15 bool vis[maxn];
 16 ll sqr,what[maxn];
 17 inline int where(int x)
 18 {
 19     return x<=sqr?x:n/x+sqr;
 20 }
 21 int gcd(int x,int y)
 22 {
 23     if(y==0)
 24         return x;
 25     return x%y==0?y:gcd(y,x%y);
 26 }
 27 inline ll qpow(ll x,ll y)
 28 {
 29     ll ans=1,base=x;
 30     while(y)
 31     {
 32         if(y&1)
 33             ans=ans*base%mod;
 34         base=base*base%mod;
 35         y>>=1;
 36     }
 37     return ans;
 38 }
 39 inline ll G(ll m)
 40 {
 41     return (m*m%mod*(m-1)%mod-m*(m-1)%mod*(2*m-1)%mod*G3%mod+mod)%mod;
 42 }
 43 void init()
 44 {
 45     mu[1]=1;
 46     f[1]=1;
 47     F[1]=1;
 48     for(int i=2;i<=1000000;++i)
 49     {
 50         if(!vis[i])
 51             prime[++size]=i,mu[i]=-1,f[i]=i-1;
 52         for(int j=1;j<=size&&prime[j]*i<=1000000;++j)
 53         {
 54             vis[prime[j]*i]=1;
 55             mu[prime[j]*i]=-mu[i];
 56             f[prime[j]*i]=f[i]*f[prime[j]]%mod;
 57             if(i%prime[j]==0)
 58             {
 59                 mu[prime[j]*i]=0;
 60                 f[prime[j]*i]=f[i]*prime[j]%mod;
 61                 break;
 62             }
 63         }
 64         F[i]=(F[i-1]+f[i]*(ll)i%mod)%mod;
 65     }
 66     for(int i=1;i<=1000000;++i)
 67         sum[i]=sum[i-1]+mu[i]*(ll)i;
 68 }
 69 void small()
 70 {
 71     cout<<(F[n]-1+mod)*G2%mod<<endl;
 72 }
 73 ll calc(ll n)
 74 {
 75     if(used[where(n)]==TOT)
 76         return what[where(n)];
 77     if(n<=1000000)
 78         return what[where(n)]=sum[n];
 79     ll g=1;
 80     for(ll l=2,r;l<=n;l=r+1)
 81     {
 82         r=n/(n/l);
 83         g=(g-(r-l+1)*(r+l)%mod*G2%mod*calc(n/l)%mod+mod)%mod;
 84     }
 85     used[where(n)]=TOT;
 86     return what[where(n)]=g;
 87 }
 88 inline ll getsum(int x)
 89 {
 90     if(x<=1000000)
 91         return sum[x];
 92     return what[where(x)];
 93 }
 94 void big()
 95 {
 96     ++TOT;
 97     sqr=sqrt(n+0.5);
 98     ll GG=calc(n);
 99     ll ans=0;
100     for(int l=1,r;l<=n;l=r+1)
101     {
102         r=n/(n/l);
103         ans=(ans+(getsum(r)-getsum(l-1)+mod)*G(n/l)%mod)%mod;
104     }
105     cout<<ans*G2%mod<<endl;
106 }
107 void solve()
108 {
109     ll a,b;
110     cin>>n>>a>>b;
111     if(n<=1000000)
112         small();
113     else
114         big();
115 }
116 int main()
117 {
118     ios::sync_with_stdio(false);
119     init();
120     cin>>T;
121     while(T--)
122         solve();
123     return 0;
124 }

原文地址:https://www.cnblogs.com/GreenDuck/p/11410367.html

时间: 2024-11-14 02:03:47

[CCPC2019 ONLINE]E huntian oy的相关文章

HDU6706 CCPC 2019网络赛 huntian oy 推式子+杜教筛

CCPC 2019 网络赛 HDU 6706 huntian oy 标签 奇奇怪怪的数论结论 杜教筛 前言 我的csdn和博客园是同步的,欢迎来访danzh-博客园~ 简明题意 给定n,a,b,求: \[\sum_{i=1}^n\sum_{j=1}^igcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\%(10^9+7)\] 思路 首先有一个结论: \[gcd(i^a-j^a,i^b-j^b)=i^{gcd(a,b)}-j^{gcd(a,b)}\] 上面的结论对于i,j互质是成立的

CCPC 2019 网络赛 HDU huntian oy (杜教筛)

1005 huntian oy (HDU 6706) 题意: 令,有T次询问,求 f(n, a, b). 其中 T = 10^4,1 <= n,a,b <= 1e9,保证每次 a,b互质. 思路: 首先我们需要知道 公式: gcd(a^n - b^n, a^m - b^m) = a^(gcd(m,n)) - b^(gcd(m,n)) 由a,b互质,原式即为 f(n, a, b) = ∑∑ (i-j)*[(i,j)=1] = ∑ (i*∑ [(i, j)=1] ) - ∑∑ j*[(i, j)=

hdu6706 huntian oy

hdu 好久没写数论函数题了,上一次写还是在纪中学min25筛的时候了,赶紧来一道补下手感 题面:求 \[ \sum_{i=1}^n\sum_{j=1}^igcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1] \] 保证\(n,a,b\leq 10^9,gcd(a,b)=1\) 知道\((i^a-j^a)\)这个玩意因式分解后有\((i-j)\),不妨大力猜一下\(gcd(i^a-j^a,i^b-j^b)=i-j\),证明明天再补 那么\[ \begin{aligned} 原式=&\

hdu 6076 huntian oy 杜教筛

打表观察得到,gcd(i,j)==1时,gcd(i^a−j^a,i^b−j^b)的值为i - j.所以,你发现这个题跟ab就没关系了... 变成去求∑∑(i-j)[gcd(i,j) == 1]了.有一个显然的结论,gcd(i,j) == gcd(i-j,i). 设k为i-j,则变成 ∑(i 1->n)∑k(1->i-1)[gcd(i,k) == 1]. 又因为i和i本身,一定不互质,所以变成 ∑(i 1->n)∑k(1->i)[gcd(i,k) == 1].然后有个结论,1…N中与

2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛

目录 1001 ^&^ 1002 array 1003 K-th occurrence 1004 path 1005 huntian oy 1006 Shuffle Card 1007 Windows Of CCPC 1008 Fishing Master 1009 Kaguya 1010 Touma Kazusa's function 1011 sakura 原文地址:https://www.cnblogs.com/Inko/p/11402622.html

2019-ACM-CCPC-Online-Contest

2019-ACM-CCPC-Online-Contest 1.^&^ 题意: ? 求一个最小的正整数\(C\),使得\((A\oplus C) \&(B\oplus C)\)最小. 思路: ? 对于\(A,B\)来说,对于他们的二进制的第\(i\)位,如果其中一个是\(0\),则\(A_i\&B_i=0\),所以只要找所有满足\(A_i=1,B_i=1\)的\(i\),将\(C\)的第\(i\)位置\(1\)就行了.所以答案就是\(A\&B\).注意题目要求正整数. 代码:

[CCPC2019秦皇岛] F. Forest Program

[CCPC2019秦皇岛 F] Link https://codeforces.com/gym/102361/problem/F Description 给定一个仙人掌,删去一些边可以让它变成一个森林(一棵树也是森林),求方案数. \(n \le 300000, m \le 500000\) Solution 用 DFS 暴力找环,然后乘法原理算一下即可.注意非环边也会有贡献. DFS 可以模仿 Tarjan 算法写. Code #include <bits/stdc++.h> using n

[CCPC2019秦皇岛] E. Escape

[CCPC2019秦皇岛E] Escape Link https://codeforces.com/gym/102361/problem/E Solution 观察到性质若干然后建图跑最大流即可. 我的 ISAP 被卡了,换成 Dinic 却过了. #include <bits/stdc++.h> using namespace std; const int maxn = 200005; const int inf = 1e+9; #define reset(x) memset(x,0,siz

CCPC2019江西省赛-Problem G.Traffic

题目描述: /*纯手打题面*/ Avin is observing the cars at a crossroads.He finds that there are n cars running in the east-west direction with the i-th car passing the intersection at time a[i].There are another m cars running in the north-south direction with th