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. 百度网盘,前几天刚从百度云改名过来,百度云这个名字给之前的百度开放云(同步盘用户比较小众)good

    作者:黑郁金香链接:http://www.zhihu.com/question/51803053/answer/127562835来源:知乎著作权归作者所有,转载请联系作者获得授权. 在8月网盘大面积 ...

  2. ADO.NET入门教程(三) 连接字符串,你小觑了吗?

    出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/12/2347914.html 摘要 ADO.NET强大的优势在于对不同的数据源提供一致的访问 ...

  3. Bolt 动画

    引擎内置的 种动画 --PosChangeAnimation 平移 local ani = XLGetObject("Xunlei.UIEngine.AnimationFactory&quo ...

  4. 使用 Spring 3 来创建 RESTful Web Services(转)

    使用 Spring 3 来创建 RESTful Web Services 在 Java™ 中,您可以使用以下几种方法来创建 RESTful Web Service:使用 JSR 311(311)及其参 ...

  5. MFC编程入门

    一. 什么是MFC? 如果你要建立一个Windows应用程序,应该如何下手? 好的开端是从设计用户界面开始. 首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象.Windows用 ...

  6. Android权限安全(10)应用与设备绑定

    有些时候开发者想要把应用与设备绑定 如: 计费应用下载,防导出运行. app内部注册付费等等. 常用的绑定方案:

  7. [Codeforces137C]History(排序,水题)

    题目链接:http://codeforces.com/contest/137/problem/C 题意:给n对数,分别是一个事件的起始和终止时间.问被有几个事件被其他事件包含. 思路:先排序,按照起始 ...

  8. javascript留言板

    用DOM相关方法创建的留言板 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <style> ...

  9. NYOJ 536 开心的mdd【矩阵链乘】

    题意:给出n个矩阵组成的序列,问最少的运算量 看的紫书: dp[i][j]表示从第i个矩阵到第j个矩阵最少的乘法次数 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j] ...

  10. listagg 函数

    listagg 函数--oracle 11g release 2 转载:http://xpchild.blog.163.com/blog/static/10180985920108485721969/ ...