题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2627

题意:计算下面式子

思路:

A先不管。我们来搞B部分。下面说如何计算B这个最后那部分

伯努利函数:

所以

带入到B中

那个f(k)中k一旦确定x,y,k就是常数,所以就是关于n的函数。

因为d^x以及莫比乌斯函数都是积性函数,而g是他们的狄利克雷卷积,所以g也是积性函数。所以依次计算每个n的质因子即可。

这样我们计算每个质因数即可。现在我们计算g(ps)

我们发现

所以

这样我们就计算出上面的B,即

那么还剩A,我们发现A=f(1)。

这样就全部搞定。这道题涉及组合数、伯努利数以及大素数的判定分解。

const i64 mod=1000000007;
const int N=3005; i64 exGcd(i64 a,i64 b,i64 &x,i64 &y)
{
i64 r,t;
if(b==0)
{
x=1;
y=0;
return a;
}
r=exGcd(b,a%b,x,y);
t=x;
x=y;
y=t-a/b*y;
return r;
} i64 reverse(i64 a,i64 b)
{
i64 x,y;
exGcd(a,b,x,y);
if(x<0) x+=mod;
return x;
} int C[N][N],p[N],pInv[N],B[N],T[N][N];
int prime[N],primeNum,tag[N]; void init()
{
p[0]=pInv[0]=1;
for(int i=1;i<N;i++)
{
p[i]=(i64)p[i-1]*i%mod;
pInv[i]=reverse(p[i],mod);
}
C[0][0]=1;
for(int i=1;i<N;i++)
{
C[i][0]=C[i][i]=1;
for(int j=1;j<i;j++)
{
C[i][j]=C[i-1][j-1]+C[i-1][j];
if(C[i][j]>=mod) C[i][j]-=mod;
}
}
B[0]=1;
for(int i=1;i<N;i++)
{
B[i]=0;
for(int j=0;j<i;j++)
{
B[i]-=(i64)C[i+1][j]*B[j]%mod;
if(B[i]<0) B[i]+=mod;
}
B[i]=B[i]*reverse(C[i+1][i],mod)%mod;
}
for(int i=0;i<N;i++)
{
i64 a=reverse(i+1,mod);
for(int j=0;j<=i;j++)
{
T[i][j]=a*B[j]%mod*C[i+1][j]%mod;
}
}
for(int i=2;i<N;i++) if(!tag[i])
{
prime[primeNum++]=i;
for(int j=i+i;j<N;j+=i) tag[j]=1;
}
} i64 Gcd(i64 x,i64 y)
{
if(!y) return x;
return Gcd(y,x%y);
} i64 mul(i64 x,i64 y,i64 mod)
{
i64 ans=0;
while(y)
{
if(y&1)
{
ans+=x;
if(ans>=mod) ans-=mod;
}
x<<=1;
if(x>=mod) x-=mod;
y>>=1;
}
return ans;
} i64 myPow(i64 a,i64 b,i64 mod)
{
i64 ans=1;
while(b)
{
if(b&1) ans=mul(ans,a,mod);
a=mul(a,a,mod);
b>>=1;
}
return ans;
} i64 myPow(i64 a,i64 b)
{
a%=mod;
i64 ans=1;
while(b)
{
if(b&1)
{
ans*=a;
if(ans>=mod) ans%=mod;
}
a*=a;
if(a>=mod) a%=mod;
b>>=1;
}
return ans;
} void cal1(i64 n,int x,int y)
{
if(0==x)
{
printf("%lld\n",n%mod);
return;
}
i64 ans=0,p=(n+1)%mod,tmp=p;
for(int i=y;i>=0;i--)
{
ans+=T[y][i]*tmp;
ans%=mod;
tmp=tmp*p%mod;
}
ans=ans*myPow(n,y)%mod;
if(ans<0) ans+=mod;
printf("%lld\n",ans);
} i64 all[N];
int allNum; int witness(i64 a,i64 n)
{
i64 m=n-1,x,y,k=0;
while(!(m&1)) k++,m>>=1;
x=myPow(a,m,n);
while(k--)
{
y=mul(x,x,n);
if(1==y&&x!=1&&x!=n-1) return 1;
x=y;
}
return y!=1;
} int isPrime(i64 n)
{
if(2==n) return 1;
if(!(n&1)) return 0;
if(1==n) return 0; int cnt=17;
while(cnt--)
{
i64 a=rand()%(n-1)+1;
if(witness(a,n)) return 0;
}
return 1;
} i64 pollard(i64 n,int c)
{
i64 x=1,y=1,d,k=2,i=1;
while(1)
{
x=mul(x,x,n)+c;
d=Gcd(abs(y-x),n);
if(d>1&&d<n) return d;
if(y==x) return n;
if(++i==k) y=x,k<<=1;
}
} void split(i64 n)
{
if(1==n) return;
if(isPrime(n))
{
all[++allNum]=n;
return;
}
i64 m=n;
int c=1;
while(m==n) m=pollard(m,++c);
split(m);
split(n/m);
} struct node
{
int primeNum;
i64 p[N];
int num[N];
i64 po[N];
}A; i64 pw[100][100],pw1[100]; i64 get(i64 i,int y)
{
i64 tmp=1;
for(int j=1;j<=A.primeNum;j++)
{
i64 S1=0,S2=0;
i64 a=myPow(A.p[j],y);
i64 b=myPow(A.p[j],y+1-i);
pw1[0]=1;
for(int k=1;k<=A.num[j];k++)
{
pw1[k]=pw1[k-1]*b;
if(pw1[k]>=mod) pw1[k]%=mod;
}
for(int k=0;k<=A.num[j];k++)
{
S1+=pw[j][k]*pw1[A.num[j]-k];
if(S1>=mod) S1%=mod;
}
for(int k=0;k<A.num[j];k++)
{
S2+=pw[j][k]*pw1[A.num[j]-k-1]%mod*a;
if(S2>=mod) S2%=mod;
}
S1-=S2;
S1%=mod;
if(S1<0) S1+=mod;
tmp=tmp*S1;
if(tmp>=mod) tmp%=mod;
tmp=tmp*myPow(A.po[j],y);
if(tmp>=mod) tmp%=mod;
}
return tmp;
} void cal2(i64 n,int x,int y)
{
allNum=0;
for(int i=0;i<primeNum;i++)
{
while(0==n%prime[i])
{
all[++allNum]=prime[i];
n/=prime[i];
}
}
if(n>1) split(n);
sort(all+1,all+allNum+1);
A.primeNum=1;
A.p[1]=all[1];
A.num[1]=1;
A.po[1]=all[1];
for(int i=2;i<=allNum;i++)
{
if(all[i]==all[i-1])
{
A.num[A.primeNum]++;
A.po[A.primeNum]*=all[i];
}
else
{
A.primeNum++;
A.p[A.primeNum]=all[i];
A.num[A.primeNum]=1;
A.po[A.primeNum]=all[i];
}
}
for(int i=1;i<=A.primeNum;i++)
{
pw[i][0]=1;
i64 a=myPow(A.p[i],x);
for(int j=1;j<=A.num[i];j++)
{
pw[i][j]=pw[i][j-1]*a;
if(pw[i][j]>=mod) pw[i][j]%=mod;
}
} i64 ans=0;
for(int i=0;i<=y;i++)
{
ans+=get(i,y)*T[y][i];
ans%=mod;
}
if(y>0) ans+=get(1,y),ans%=mod;
if(ans<0) ans+=mod;
printf("%lld\n",ans);
} int main()
{ init();
int T=myInt();
while(T--)
{
i64 n;
int x,y;
scanf("%lld%d%d",&n,&x,&y);
if(x==y) cal1(n,x,y);
else cal2(n,x,y);
}
}

  

BZOJ 2627 JZPKIL的更多相关文章

  1. bzoj 2627: JZPKIL [伯努利数 Pollard-rho]

    2627: JZPKIL 题意:求 \[ \sum_{i=1}^n (n,i)^x [i,n]^y,\ [i,n] = lcm(i,n) \] \(n \le 10^{18},\ x,y\le 300 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  4. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  5. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  6. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  7. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  8. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  9. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

随机推荐

  1. 夺命雷公狗---DEDECMS----32dedecms电影网评价星星功能的实现

    我们要完成的是电影网的评价功能: 我们要做这个功能前,就要让前期工作准备好,首先让鼠标移动到星星时,星星的左边都是黄色的星星右边还是灰星星. 我们打开内容页的模版看下他代码是如何组成的: 我们在这里可 ...

  2. cactive信号

    AXI中C-channel的cactive信号并不仅仅应用在CSYSREQ,CSYSACK交互中. CSYSREQ和CSYSACK信号都在低电平表示lower power的请求和应答有效. cacti ...

  3. zw版【转发·台湾nvp系列Delphi例程】HALCON FillUp1

    zw版[转发·台湾nvp系列Delphi例程]HALCON FillUp1 procedure TForm1.Button1Click(Sender: TObject);var img : HImag ...

  4. Mysql 的存储引擎,myisam和innodb的区别

    MyISAM 是非事务的存储引擎,innodb是支持事务的存储引擎. innodb的引擎比较适合于插入和更新操作比较多的应用,而MyISAM 则适合用于频繁查询的应用 . MyISAM --表锁,in ...

  5. update表关联

    第一种: update student set student.age =(select `user`.age from user where id=student.id ) where studen ...

  6. SQL UNION 操作符

    转由http://www.w3school.com.cn/sql/sql_union.asp 这个网址的数据库知识,个人推荐,因为有实例,理解更透彻一些.非广告啊,个人感觉好啊 SQL UNION 操 ...

  7. 在路由器 RT-AC68U 使用自定义 DDNS 用 3322.org 动态域名的方法

    0.使用华硕的第三方固件 -- 梅林固件 , 具体更新固件方法不在本主题述说 1.打开 jffs, 以便启动时可以自动执行脚本 2.在 /jffs/scripts 下新建 ddns-start 文件. ...

  8. Linux字符设备驱动结构(一)--cdev结构体、设备号相关知识机械【转】

    本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50839042 一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符 ...

  9. LUA笔记之表

    表据说是LUA的核, 呵呵, 看例子吧, 看上去, 跟java的list很像, 又有点像json: a = {} -- create a table and store its reference i ...

  10. Linux Runtime PM介绍【转】

    转自:http://blog.csdn.net/wlwl0071986/article/details/42677403 一.Runtime PM引言 1. 背景 (1)display的需求 (2)系 ...