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}
原式=&\sum_{i=1}^n\sum_{j=1}^i(i-j)[gcd(i,j)=1]\=&\sum_{i=1}^n\sum_{j=1}^i(i-j)\sum_{d|gcd(i,j)}\mu(d)\=&\sum_{d=1}^n\mu(d)d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^ii-j\\end{aligned}
\]

后面那个你拿平方和公式算一下应该有\(\sum_{i=1}^n\sum_{j=1}^ii-j=\frac{n^3-n}{6}\),前面那一部分就是\(\mu·id\),卷上\(id\)之后就是\(\epsilon\),杜教筛直接求

感觉我回忆杜教筛的时间都比前面推导的时间长。。。

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<math.h>
#include<queue>
#include<set>
#include<map>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
const int N=6000000;
const db pi=acos(-1.0);
#define lowbit(x) (x)&(-x)
#define sqr(x) (x)*(x)
#define rep(i,a,b) for (register int i=a;i<=b;i++)
#define per(i,a,b) for (register int i=a;i>=b;i--)
#define fir first
#define sec second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define maxd 1000000007
#define inv6 166666668
#define eps 1e-8
int pri[N+10],tot=0,mu[N+10];
int sum[N+10];
bool vis[N+10];
unordered_map<int,ll> has;

int read()
{
    int x=0,f=1;char ch=getchar();
    while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
    while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
    return x*f;
}

void sieve()
{
    mu[1]=1;
    rep(i,2,N)
    {
        if (!vis[i]) {pri[++tot]=i;mu[i]=-1;}
        for (int j=1;j<=tot && i*pri[j]<=N;j++)
        {
            vis[i*pri[j]]=1;
            if (i%pri[j]==0) break;
            else mu[i*pri[j]]-=mu[i];
        }
    }
    rep(i,1,N) sum[i]=(sum[i-1]+i*mu[i]+maxd)%maxd;
}

ll calc(int n)
{
    ll ans=1ll*n*n%maxd*n%maxd;
    ans=(ans-n+maxd)%maxd;
    ans=ans*inv6%maxd;
    return ans;
}

ll query(int n)
{
    if (n<=N) return sum[n];
    if (has[n]) return has[n];
    ll ans=1;int l,r;
    for (l=2;l<=n;l=r+1)
    {
        r=n/(n/l);
        ll tmp=(1ll*(r+l)*(r-l+1)/2)%maxd;
        ans=(ans-tmp*query(n/l)%maxd+maxd)%maxd;
    }
    has[n]=ans;
    return ans;
}

ll f(int n,int a,int b)
{
    ll ans=0;
    int l,r;
    for (l=1;l<=n;l=r+1)
    {
        r=n/(n/l);
        ll nowsum=(query(r)-query(l-1)+maxd)%maxd;
        ans=(ans+nowsum*calc(n/l)%maxd)%maxd;
    }
    return ans;
}

int main()
{
    int T=read();
    sieve();
    while (T--)
    {
        int n=read(),a=read(),b=read();
        printf("%lld\n",f(n,a,b));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/encodetalker/p/11406654.html

时间: 2024-10-26 21:57:04

hdu6706 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)=

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中与

[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}{\m

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\).注意题目要求正整数. 代码:

Phonics 自然拼读法 ou ow oi oy au aw oo oo ea Teacher:Lamb

# 开课暖场视频 老美王霸胆 7个你不能不知道的“英语连读”规则_演讲 http://www.iqiyi.com/w_19rujuwdwx.html # z w ng,v(little) oo, (long) oo # Home Practice 原文地址:https://www.cnblogs.com/Cong0ks/p/11445301.html

K-Means算法Python实现

from numpy import * from random import _inst import numpy as np import matplotlib.pyplot as plt def fileMat(filename): file = open(filename, "r") contain = file.readlines() count = len(contain) features = zeros((count, len(contain[0].split(','))

JNI之——在cmd命令行下编译执行C/C++源文件

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46604269 一直用java来敲代码,java配置好jre路径之后.在cmd下编译执行.非常方便. 刚好要给一个舍友改下C程序,想到可不能够像java一样在环境变量里配置好C的编译路径呢? 于是上网搜了一下,得到例如以下结果: 一.假设装有VC,那就简单了,由于VC带有C的编译器,能够将此路径设置进环境变量. Windows系统下编译连接源码方法: cl -GX test.c -