题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202

参考了博客:

https://www.cnblogs.com/zhoushuyu/p/9657640.html

https://www.cnblogs.com/DUXT/p/5957944.html?utm_source=itdadao&utm_medium=referral

https://blog.csdn.net/Maxwei_wzj/article/details/83184110

https://blog.csdn.net/a_crazy_czy/article/details/50688526

据 Narh 的想法,其实算珠子个数也可以从置换的角度,三棱柱有6种置换,循环节个数为1的有2个,个数为2的有3个,个数为3的有1个;

然后一个循环节内数字相同,于是也是那样算...

还不太懂 O(1) 快速乘...

注意模 P 和模 mod 。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=1e7+,P=1e9+;
ll const mod=(ll)P*P;int A,pri[xn],cnt,mu[xn],pk[xn],num;
ll n,m,ans,p[xn];//p!!
bool vis[xn];
void init()
{
mu[]=; int mx=1e7;
for(int i=;i<=mx;i++)
{
if(!vis[i])pri[++cnt]=i,mu[i]=-;
for(int j=;j<=cnt&&(ll)i*pri[j]<=mx;j++)
{
vis[i*pri[j]]=;
if(i%pri[j]==){mu[i*pri[j]]=; break;}
mu[i*pri[j]]=-mu[i];
}
}
for(int i=;i<=mx;i++)mu[i]+=mu[i-];
}
ll mul(ll a,ll b){return (a*b-(ll)(((long double)a*b+0.5)/(long double)mod)*mod+mod)%mod;}
ll upt(ll x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
ll pw(ll a,ll b)
{
ll ret=; a=a%mod;
for(;b;b>>=1ll,a=mul(a,a))if(b&)ret=mul(ret,a);
return ret;
}
ll pw2(ll a,ll b)
{
ll ret=; a=a%P;
for(;b;b>>=1ll,a=(a*a)%P)if(b&)ret=(ret*a)%P;
return ret;
}
void div(ll x)
{
num=;
for(int i=;i<=cnt&&(ll)pri[i]*pri[i]<=x;i++)
{
if(x%pri[i])continue;
p[++num]=pri[i]; pk[num]=;
while(x%pri[i]==)pk[num]++,x/=pri[i];
}
if(x>)p[++num]=x,pk[num]=;
}
ll calf(ll x)
{
ll tmp;
if(x&)tmp=upt(-m); else tmp=upt(m-);
return upt(pw(upt(m-),x)+tmp);
}
void dfs(int nw,ll d,ll phi)
{
if(nw==num+){ans=upt(ans+mul(calf(n/d),phi)%mod); return;}
dfs(nw+,d,phi);
d*=p[nw]; phi*=p[nw]-; dfs(nw+,d,phi);
for(int i=;i<=pk[nw];i++)
d*=p[nw],phi*=p[nw],dfs(nw+,d,phi);
}
int main()
{
int T; init();
scanf("%d",&T);
while(T--)
{
scanf("%lld%d",&n,&A);
//if(n%P==0)mod=(ll)P*P; else mod=P;//??
ll ans2=,ans3=;
for(ll i=,j;i<=A;i=j+)
{
j=A/(A/i);
ans2=upt(ans2+mul(mul(A/i,A/i),mu[j]-mu[i-]+mod)%mod);
ans3=upt(ans3+mul(mul(mul(A/i,A/i),A/i),mu[j]-mu[i-]+mod)%mod);
}
m=upt(ans3+mul(ans2,)); m=upt(m+);
m=mul(m,pw(,(ll)P*(P-)-)%mod);//phi[mod]-1 div(n); ans=; dfs(,,); if(n%P==)ans=(ans/P*pw2(n/P,P-))%P;//P-2
else ans=(ans%P*pw2(n%P,P-))%P;//pw,mul:%mod
printf("%lld\n",ans);
}
return ;
}

bzoj 3202 [Sdoi 2013] 项链 —— 置换+计数的更多相关文章

  1. [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)

    [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...

  2. BZOJ 3203 sdoi 2013 保护出题人

    由于样例解释很清晰,所以很容易得到以下结论: 1.每一关都是独立的,且僵尸的相对位置不会变 2.每一关的攻击力=Max(sum(i)/dis(i)) 其实sum(i)是僵尸攻击力的前缀和,dis(i) ...

  3. [BZOJ 3167][HEOI 2013]SAO

    [BZOJ 3167][HEOI 2013]SAO 题意 对一个长度为 \(n\) 的排列作出 \(n-1\) 种限制, 每种限制形如 "\(x\) 在 \(y\) 之前" 或 & ...

  4. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  5. [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)

    [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...

  6. [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap)

    [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap) 题面 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数 ...

  7. BZOJ 3236 AHOI 2013 作业 莫队+树状数组

    BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出     题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...

  8. [BZOJ 3144][HNOI 2013] 切糕

    题目大意 切糕是 (p times q times r) 的长方体,每个点有一个违和感 (v_{x, y, z}).先要水平切开切糕(即对于每个纵轴,切面与其有且只有一个交点),要求水平上相邻两点的切 ...

  9. bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 可见Zinn博客:https://www.cnblogs.com/Zinn/p/100 ...

随机推荐

  1. Git常见命令整理

    Git常见命令整理 + 注释 git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 gi ...

  2. 七、golang中接口、反射

    一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package main import ( "fmt" ...

  3. SQL性能调优策略

    1.建立索引 2.避免全表扫描 避免使用is null, is not null,这样写会放弃该字段的索引. 如果会出现这种情况,尽量在设计表的时候设置默认值 比较操作符中!= <>等避免 ...

  4. C# 利用TTS实现文本转语音

    TSS(Text To Speech),语音朗读文本的技术,在Windows下台下,微软给我们提供了一套API接口(Speech API).金山词霸的朗读功能就是用的这个接口. WindowsXP自带 ...

  5. Go reflect反射

    Go语言中的反射非常强大,可以对string, int, struct, func...进行反射,使用起来也比较简单. 示例1:反射函数 package main import ( "fmt ...

  6. Go CSP模型

    CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,由 Tony Hoare 于 1977 年提出.简单来说,CSP 模 ...

  7. Go HelloWorld 网络版和并发版

    网络版 package main import ( "net/http" "fmt" ) func main() { http.HandleFunc(" ...

  8. processing学习整理---Input(输入)

    1.鼠标1D. 左右移动鼠标可移动天平. “mouseX”变量用于控制矩形的大小和颜色. void setup(){ size(640,360); noStroke(); colorMode(RGB, ...

  9. Solr新建collection时报错 Caused by: Direct buffer memory

    错误如下 [root@192.168.1.235 conf]# curl "http://192.168.1.235:8983/solr/admin/collections ?action= ...

  10. Phoenix表和索引分区数对插入和查询性能的影响

    1. 概述 1.1 HBase概述 HBase由master节点和region server节点组成.在100-105集群上,100和101是master节点,102-105是region serve ...