题意有点儿神秘,而且出题人可能有点大病(

  1. 项链由 \(n\) 颗珠子构成,相邻的珠子不能相同。

  2. 每颗珠子上有 \(3\) 个数字,这 \(3\) 个数之间没有顺序,且 \(\gcd\) 为 \(1\)。

为什么珠子是三菱柱啊

明确一下思路:先算出有多少种可能的珠子,再计算方案数。

有多少种可能的珠子莫反一下就好了,很简单。

然后考虑 polya。

设 \(f(n,m)\) 是长度为 \(n\) 的环且环上的数值域为 \([1,m]\),不存在相邻的数相同的环的数量。(下面将 \(f(n,m)\) 写成 \(f(n)\))

来考虑最后两个位置。

  1. 靠左的与第一个相同:\(f(n-2)\times(m-1)\)。

  2. 靠左的与第一个不同:\(f(n-1)\times(m-2)\)。

所以:\(f(n)=(m-2)\times f(n-1)+(m-1)\times f(n-2)\)。

注意到这玩意儿是 \([x^n]\frac{m(m-1)x^2}{1-(m-2)x-(m-1)x^2}=m(m-1)[x^{n-2}]\frac{1}{1-(m-2)x-(m-1)x^2}\)。

对于后面这玩意儿,如果你懒得算的话,可以设一个 \(p[k][m]=x^{kn}\pmod{1-(m-2)x-(m-1)x^2}\),然后像快速幂那样乘起来。(其实就和矩阵的光速幂是一个玩意儿)

你也可以直接把通项推出来,得到 \(f(n)=(m-1)^n+(-1)^n(m-1)\)。

然后。。。如果 \(n\) 是 \(1e9+7\) 的倍数,你可就有大麻烦了。。。

需要将模数修改为 \((1e9+7)^2\),然后写龟速乘。

#include<cstdio>
typedef long long ll;
const int SZ=1<<10|5,M=1e7+5,mod=1e9+7,MOD=mod-1;
int T,mx,top,a[15],pri[M],mu[M],Smu[M];ll n[15];bool zhi[M];
int len,ans,k[15];ll p[15];
int p1[SZ],p2[SZ],p3[SZ];
inline void sieve(const int&M){
mu[1]=1;
for(int i=2;i<=M;++i){
if(!zhi[i])pri[++top]=i,mu[i]=-1;
for(int x,j=1;j<=top&&(x=i*pri[j])<=M;++j){
zhi[x]=true;if(!(i%pri[j]))break;mu[x]=-mu[i];
}
}
for(int i=1;i<=M;++i)Smu[i]=Smu[i-1]+mu[i];
}
inline int pw2(const int&n){
return 1ll*n*n%mod;
}
inline int pw3(const int&n){
return 1ll*pw2(n)*n%mod;
}
inline int Getlim(const int&n){
int L,R,x,sum1(0),sum2(0);
for(L=1;L*L<=n;++L)sum1=(sum1+1ll*(mod+mu[L])*pw3(x=n/L))%mod;
for(;L<=n;L=R+1){
if(x*L>n)--x;R=n/x;
sum1=(sum1+1ll*(Smu[R]-Smu[L-1]+mod)*pw3(x))%mod;
}
for(L=1;L*L<=n;++L)sum2=(sum2+1ll*(mod+mu[L])*pw2(x=n/L))%mod;
for(;L<=n;L=R+1){
if(x*L>n)--x;R=n/x;
sum2=(sum2+1ll*(Smu[R]-Smu[L-1]+mod)*pw2(x))%mod;
}
return 166666668ll*(sum1+3ll*sum2+2)%mod;
}
inline int pow(const int&idx){
return 1ll*p1[idx&1023]*p2[idx>>10&1023]%mod*p3[idx>>20]%mod;
}
int kx;
inline void DFS(const ll&n,const int&id,const ll&d,const int&phi,const int&m){
if(id==len+1){
ans=(ans+1ll*(pow((n/d)%MOD)+((n/d)&1?mod+1-m:m-1))*phi)%mod;return;
}
DFS(n,id+1,d,phi,m);
ll fd=p[id];int fphi=p[id]%mod-1;
for(int i=1;i<=k[id];++i){
DFS(n,id+1,d*fd,1ll*phi*fphi%mod,m);
fd=fd*p[id];fphi=1ll*fphi*p[id]%mod;
}
}
inline void init(int x,const int&lim){
p1[0]=p2[0]=p3[0]=1;
p1[1]=x;
for(int i=1;i<=1024;++i){
if((i<<0*10)>lim)return;p1[i]=1ll*p1[i-1]*x%mod;
}
x=p1[1024];p2[1]=x;
for(int i=1;i<=1024;++i){
if((i<<1*10)>lim)return;p2[i]=1ll*p2[i-1]*x%mod;
}
x=p2[1024];p3[1]=x;
for(int i=1;i<=1024;++i){
if((i<<2*10)>lim)return;p3[i]=1ll*p3[i-1]*x%mod;
}
}
inline int INV(int n){
int b=mod-2,ans(1);for(;b;b>>=1,n=1ll*n*n%mod)if(b&1)ans=1ll*ans*n%mod;return ans;
}
inline int Solve(ll n,int m){
ll N=n;
m=Getlim(m);init(m-1,n>MOD?MOD:n);len=ans=0;
for(int i=2;1ll*i*i<=n;++i)if(!(n%i)){
p[++len]=i;k[len]=0;while(!(n%i))++k[len],n/=i;
}
if(n^1)p[++len]=n,k[len]=1;
DFS(N,1,1,1,m);
return 1ll*ans*INV(N%mod)%mod;
}
namespace HELL_MOD{
typedef long long ll;
const ll mod=1000000007ll*1000000007ll;
ll p1[SZ],p2[SZ],p3[SZ],p4[SZ],p5[SZ];ll ans;
inline ll Mod(const ll&n){
return n<0?n+mod:n>=mod?n-mod:n;
}
inline ll Add(const ll&a,const ll&b){
return a+b>=mod?a+b-mod:a+b;
}
inline ll times(ll a,ll b){
const unsigned long long x=a,y=b,MOD=mod;
return (x*y-(unsigned long long)((long double)x/MOD*y)*MOD+MOD)%mod;
if(a<b)a^=b^=a^=b;
ll ans(0);for(;b;b>>=1,a=Add(a,a))if(b&1)ans=Add(ans,a);return ans;
}
inline ll pw2(const ll&n){
return times(n,n);
}
inline ll pw3(const ll&n){
return times(pw2(n),n);
}
inline ll Getlim(const int&n){
int L,R,x;ll sum1(0),sum2(0);
for(L=1;L*L<=n;++L)sum1=Add(sum1,times(Mod(mu[L]),pw3(x=n/L)));
for(;L<=n;L=R+1){
if(x*L>n)--x;R=n/x;
sum1=Add(sum1,times(Add(Mod(Smu[R]),Mod(mod-Smu[L-1])),pw3(x)));
}
for(L=1;L*L<=n;++L)sum2=Add(sum2,times(Mod(mu[L]),pw2(x=n/L)));
for(;L<=n;L=R+1){
if(x*L>n)--x;R=n/x;
sum2=Add(sum2,times(Add(Mod(Smu[R]),Mod(mod-Smu[L-1])),pw2(x)));
}
return times(833333345000000041ll,(sum1+3ll*sum2+2)%mod);
}
inline ll pow(const ll&idx){
return times(times(times(times(p1[idx&1023],p2[idx>>10&1023]),p3[idx>>20&1023]),p4[idx>>30&1023]),p5[idx>>40]);
}
inline void DFS(const ll&n,const int&id,const ll&d,const ll&phi,const ll&m){
if(id==len+1){
ans=Add(ans,times(Add(pow(n/d),(n/d)&1?mod+1-m:m-1),phi));
return;
}
DFS(n,id+1,d,phi,m);
ll fd=p[id],fphi=p[id]%mod-1;
for(int i=1;i<=k[id];++i){
DFS(n,id+1,d*fd,phi*fphi,m);
fd=fd*p[id];fphi=fphi*p[id];
}
}
inline void init(ll x,const ll&lim){
p1[0]=p2[0]=p3[0]=p4[0]=p5[0]=1;
p1[1]=x;
for(int i=1;i<=1024;++i){
if((1ll*i<<0*10)>lim)return;p1[i]=times(p1[i-1],x);
}
x=p1[1024];p2[1]=x;
for(int i=1;i<=1024;++i){
if((1ll*i<<1*10)>lim)return;p2[i]=times(p2[i-1],x);
}
x=p2[1024];p3[1]=x;
for(int i=1;i<=1024;++i){
if((1ll*i<<2*10)>lim)return;p3[i]=times(p3[i-1],x);
}
x=p3[1024];p4[1]=x;
for(int i=1;i<=1024;++i){
if((1ll*i<<3*10)>lim)return;p4[i]=times(p4[i-1],x);
}
x=p4[1024];p5[1]=x;
for(int i=1;i<=1024;++i){
if((1ll*i<<4*10)>lim)return;p5[i]=times(p5[i-1],x);
}
}
inline int Solve(ll n,ll m){
ll N=n;
m=Getlim(m);init(m-1,n);len=ans=0;
for(int i=2;1ll*i*i<=n;++i)if(!(n%i)){
p[++len]=i;k[len]=0;while(!(n%i))++k[len],n/=i;
}
if(n^1)p[++len]=n,k[len]=1;DFS(N,1,1,1,m);
return 1ll*(ans/::mod)*INV(N/::mod)% ::mod;
}
}
signed main(){
scanf("%d",&T);
for(int i=1;i<=T;++i){
scanf("%lld%d",n+i,a+i);
if(a[i]>mx)mx=a[i];
}
sieve(mx);
for(int i=1;i<=T;++i)printf("%d\n",n[i]%mod?Solve(n[i],a[i]):HELL_MOD::Solve(n[i],a[i]));
}

LGP3307题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 前端也能做AI

    殷圣魁 58架构师 7月16日 原文链接 前言 相信不少人看过一篇人工智能已经能实现自动编写HTML,CSS的文章,人工智能开始取代前端的一部分工作.前端开发行业真的被人工智能取代吗? 1.人工智能发 ...

  2. PHP页面编码问题

    页面编码统一MySQL数据库编码.html页面编码.PHP或html文件本身编码要全部一致.1.MySQL数据库编码:建立数据库时指定编码(如gbk_chinese_ci),建立数据表.建立字段.插入 ...

  3. 直播流媒体fms

    第一步  下载  Flash Media Server 4.5 安装教程网上很多 也很简单 我的密码记录  用户admin  密码admin23456 第二步 直接 下载 直播测试工具 FlashMe ...

  4. 类(静态)变量和类(静态)static方法以及main方法、代码块,final方法的使用,单例设计模式

    类的加载:时间 1.创建对象实例(new 一个新对象时) 2.创建子类对象实例,父类也会被加载 3.使用类的静态成员时(静态属性,静态方法) 一.static 静态变量:类变量,静态属性(会被该类的所 ...

  5. python使用泛型

    所谓的泛型, 就是将数据类型作为参数进行传递, 即在我们用的时候确定数据类型, 这是一种在面向对象语言中经常使用的特性 一般类使用 以SQLAlchemy举例 比如: 我们统一写个将数据保存到数据库的 ...

  6. R数据分析:数据清洗的思路和核心函数介绍

    好多同学把统计和数据清洗搞混,直接把原始数据发给我,做个统计吧,这个时候其实很大的工作量是在数据清洗和处理上,如果数据很杂乱,清洗起来是很费工夫的,反而清洗好的数据做统计分析常常就是一行代码的事情. ...

  7. Spring源码之BeanFactoryPostProcessor(后置处理器)

    Spring源码之BeanFactoryPostProcessor(后置处理器). 有点水平的Spring开发人员想必都知道BeanFactoryPostProcessor也就是常说的后置管理器,这是 ...

  8. [题解]第十一届北航程序设计竞赛预赛——L.偶回文串

    题目描述 长度为偶数的回文串被称为偶回文串.如果一个字符串重新排序之后能够成为一个偶回文串,则称为可回文的. 给一个字符串,求可回文的子串个数.字符串只含小写字母,单个字符串长度不超过10^5,所有数 ...

  9. RIP协议测试——信而泰网络测试仪实操

    一.简介: RIP(Routing Information Protocol,路由信息协议)是一种内部网关协议(IGP),是一种动态路由选择协议,用于自治系统(AS)内的路由信息的传递.RIP协议基于 ...

  10. 可视化里程碑:可拖拽使用的可视化BI工具

    在数据量越来越大的今天,如何利用好数据,更好的为人类社会服务,成为人们所关心的话题,而其中数据可视化作为最后一个环节,也是人们最为直观的感受,自然而然备受重视.同质化的应用越来越多,应用开发者也开始在 ...