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

BC #85 1005

思路:

首先原式化简:x​^gcd(a,b)​​−1

也就是求n内,(公约数是i的对数)*x^i-1的和,其中i为n内的两两最大公约数。那么问题可以转化成先预处理出i,再求和,注意O(n*300)=1,正常情况会卡常数。必须还要优化

由于 ans=∑s[d]∗(x^​d​​−1),记s[d]=最大公约数为d的对数

我们注意到求s[d] or (公约数是i的对数),也就是求n/i以内互质数的对数,显然用欧拉来做

s[d]=2*(phi[1]+phi[2]+...+phi[n/d])-1

注意到:d不同,但是n/d一样,也就是s[d]可能有多个相同,比如 10/6 10/7 10/8 10/9 10/10,所以求s[d]相同的项,我们可以用等比公式求和(快速幂+逆元 新知识)

所以我们只要找到每一段s[d]就可以 即 j=n/(n/i),j为最后一个相同s[d]的下标

 // #pragma comment(linker, "/STACK:102c000000,102c000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
// #include <conio.h>
using namespace std;
#define pi acos(-1.0)
const int N = 1e6+;
const int MOD = 1e9+;
#define inf 0x7fffffff
typedef long long LL; void fre() { freopen("in.txt","r",stdin);}
inline int read(){int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-;ch=getchar();}while(ch>=''&&ch<='') { x=x*+ch-'';ch=getchar();}return x*f;} LL pow_m(LL x,LL n)
{
LL res=;
while(n>)
{
if(n & )
res=(res*x)%MOD;
x=(x*x)%MOD;
n >>= ;
}
return res;
} int prime[N],sphi[N];
int inv[N];
void e_fun(){
sphi[]=;
for(int i=;i<=N;i++){
if(!sphi[i]){
prime[++prime[]]=i;
sphi[i]=i-;
}
for(int j=;j<=prime[]&&i*prime[j]<=N;j++){
if(i%prime[j]) sphi[i*prime[j]]=sphi[i]*(prime[j]-);
else sphi[i*prime[j]]=sphi[i]*prime[j];
}
}
for(int i=;i<=N;i++) sphi[i]=(sphi[i-]+sphi[i])%MOD; //打表求逆元
// inv[1] = inv[0] = 1;
// for(int i = 2;i < N;i++)
// inv[i] = inv[MOD%i]*(MOD-MOD/i)%MOD;
} void ex_gcd(LL a,LL b,LL &d,LL &x,LL &y) {
if (!b) {
d = a;
x = ;
y = ;
}
else {
ex_gcd(b, a%b, d, y, x);
y -= x*(a/b);
}
// return x;
} LL sn(LL q,LL n){
if(q==) return n;
LL x,y,d;
ex_gcd(q-,MOD,d,x,y);
return (pow_m(q,n)-)*((x+MOD)%MOD)%MOD;
} int main(){
e_fun();
int T;
T=read();
while(T--){
int x,n;
x=read(),n=read();
LL ans=;
for(int i=,j;i<=n;i=j+){
j=n/(n/i);
LL sd=*sphi[n/i]-;
ans=(ans + sd*(pow_m(x,i)*sn(x,j-i+)%MOD -(j-i+))%MOD) % MOD;
}
printf("%I64d\n",ans);
}
return ;
}

HDU5780 gcd 欧拉函数的更多相关文章

  1. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  2. POJ 2773 Happy 2006【GCD/欧拉函数】

    根据欧几里德算法,gcd(a,b)=gcd(a+b*t,b) 如果a和b互质,则a+b*t和b也互质,即与a互质的数对a取模具有周期性. 所以只要求出小于n且与n互质的元素即可. #include&l ...

  3. HDU 2588 GCD (欧拉函数)

    GCD Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status De ...

  4. Bzoj-2818 Gcd 欧拉函数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...

  5. BZOJ2818: Gcd 欧拉函数求前缀和

    给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ...

  6. hdu2588 gcd 欧拉函数

    GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. HDU 1695 GCD 欧拉函数+容斥定理

    输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...

  8. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. HDU 1695 GCD (欧拉函数,容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

随机推荐

  1. HTML5入门7---"session的会话缓存"和"localStorage的cookie"缓存数据

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. parent children

    class parent{ protected static int count=0; public parent() { count++; } } public class child extend ...

  3. Android Studio安装、配置

    Google在2013年I/O大会上发布了Android Studio,AndroidStudio是一个基于IntelliJ IDEA的Android开发工具.这个IDE要比eclipse智能很多,具 ...

  4. cololection

    package cn.bjsxt.col; /** * 简化迭代器原理 * hasNext * next * @author Administrator * */ public class MyArr ...

  5. fiddler for mac

    Fiddler 是一免费的web调试工具.并且兼容所有浏览器.系统和平台. Fiddler 是基于微软的 .Net 技术开发的,没办法直接在 Mac/Linux 下使用.本文介绍一些替代方案(这些方案 ...

  6. 真心崩溃了,oracle安装完成后居然没有tnsnames.ora和listener.ora文件

    problem: oracle  11  r2  64位安装完成后NETWORK/ADMIN目录下居然没有tnsnames.ora和listener.ora文件 solution: 问题是之前安装了另 ...

  7. 函数fsp_try_extend_data_file

    扩展表空间 /***********************************************************************//** Tries to extend t ...

  8. Struts2配置

    1.      设定server a)      window– preferences – myeclipse – servers – tomcat – 6.x b)      选择tomcat h ...

  9. C#开发COM+组件和ActiveX控件

    using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices ...

  10. error C2471: 无法更新程序数据库 vc90.pdb

    error C2471: 无法更新程序数据库“d:/Work/ Project/debug/vc90.pdb” fatal error C1083: 无法打开程序数据库文件:“d:/Work/ Pro ...