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

可见Zinn博客:https://www.cnblogs.com/Zinn/p/10073897.html

关于算有序三元组那个部分,自己觉得是这样解释:

这样标号的话,旋转置换有2个:(1,2,3)和(1,3,2); 不动的话是一个置换:(1)(2)(3); 翻转的话,贴着一个侧面所在的面上下翻转,就是三个置换:(1)(2,3)、(2)(1,3)、(3)(1,2)。根据Polya定理算不动点个数,就是 \( \frac{1}{6}(2*g(1)+g(3)+3*g(2) \) ,其中 g(x) 表示选 x 个数且其gcd=1的方案数。(比如 (1,2,3) ,如果“不动”的话,3个位置的数都要一样,即找1个数,是g(1);(1)(2,3)的话,2、3位置的数一样,即找两个数,是g(2))。

通过 dfs 质因数的幂来找出所有约数的方法很好,因为可以顺便做出 phi 。

注释掉的那个快速乘好像会 WA ?

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e7+,mod=1e9+,base=1e5;
ll M=(ll)(1e9+)*(ll)(1e9+);//(ll)!!!!!
int a,T,pri[N],cnt;ll n,t,u[N],ans,p[],q[],tot,tmd;
bool vis[N],fx;
void upd(ll &x,ll md){x>=md?x-=md:;x<?x+=md:;}
/*ll mul(ll a,ll b,ll md)
{ll ret=0;while(b){if(b&1ll)ret+=a,upd(ret,md);a+=a;upd(a,md);b>>=1ll;}return ret;}*/
/*ll mul(ll a,ll b,ll md)//slow and WA?
{
ll bs=(md==M?mod:base);
ll A=a/bs,B=a%bs,C=b/bs,D=b%bs;
ll ret=A*C%md*bs%md*bs%md;
ret=(ret+A*D%md*bs)%md;
ret=(ret+B*C%md*bs)%md;
ret=(ret+B*D)%md;
return ret;
}
*/
ll mul(ll a,ll b,ll md)
{
return (a*b-(ll)( ((long double)a*b+0.5)/(long double)md )*md+md)%md;
}
ll pw(ll x,ll k,ll md)
{x%=md;k%=(md-);ll ret=;while(k){if(k&)ret=mul(ret,x,md);x=mul(x,x,md);k>>=;}return ret;}
void calc(ll md)
{
ll g2=,g3=;
for(int i=,j,d;i<=a;i=j+)
{
d=a/i; j=a/d; ll k=u[j]-u[i-];upd(k,md);
ll tmp=mul(mul(d,d,md),k,md);
g2=g2+tmp; upd(g2,md);
tmp=mul(tmp,d,md);
g3=g3+tmp; upd(g3,md);
}
t=(g3+*g2+)%md;
t=mul(t,pw(,fx?M-mod-:mod-,md),md);//phi(M)=mod*(mod-1)
}
void init()
{
memset(vis,,sizeof vis); cnt=;
u[]=; ll d;
for(int i=;i<=a;i++)
{
if(!vis[i])u[i]=-,pri[++cnt]=i;
for(int j=;j<=cnt&&(d=(ll)i*pri[j])<=a;j++)
{
vis[d]=;u[d]=-u[i];
if(i%pri[j]==){u[d]=;break;}
}
}
for(int i=;i<=a;i++)u[i]+=u[i-],upd(u[i],tmd);
calc(tmd);
}
ll F(ll x,ll md)
{
ll ret=;
if(x&1ll)ret=-t; else ret=t-;
upd(ret,md);
ret+=pw(t-,x,md); upd(ret,md);
return ret;
}
ll Phi(ll x,ll md)
{
ll ret=x,yx=x;
for(ll d=;d*d<=x;d++)
if(x%d==)
{
ret/=d; ret*=(d-);
while(x%d==)x/=d;
}
if(x>)ret/=x,ret*=(x-);
return ret%md;
}
void cal(ll x)
{
tot=;
for(ll i=;i*i<=x;i++)
if(x%i==)
{
p[++tot]=i;q[tot]=;
while(x%i==)x/=i,q[tot]++;
}
if(x>)p[++tot]=x,q[tot]=;
}
void dfs(int cr,ll nw,ll phi)
{
if(cr>tot){ans+=mul(F(n/nw,tmd),phi,tmd);upd(ans,tmd);return;}
dfs(cr+,nw,phi);
nw*=p[cr];phi*=p[cr]-;//needn't tmd
dfs(cr+,nw,phi);
for(int i=;i<=q[cr];i++)
nw*=p[cr],phi*=p[cr],dfs(cr+,nw,phi);
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld%d",&n,&a);
fx=(n%mod==); if(fx)tmd=M; else tmd=mod;
init(); ans=;
cal(n); dfs(,,);
/*
for(ll d=1;d*d<=n;d++)//d=1
if(n%d==0)
{
ll k=n/d;
ans+=mul(F(d,md),Phi(k,md),md); upd(ans,md);
if(k!=d)ans+=mul(F(k,md),Phi(d,md),md), upd(ans,md);//mul
}
*/
if(fx)ans/=mod,ans=ans*pw(n/mod,mod-,mod)%mod;
else ans=ans*pw(n,mod-,mod)%mod;
printf("%lld\n",ans);
}
return ;
}

bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子的更多相关文章

  1. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

  2. bzoj 3202: [Sdoi2013]项链

    Description 项链是人体的装饰品之一,是最早出现的首饰.项链除了具有装饰功能之外,有些项 链还具有特殊显示作用,如天主教徒的十字架链和佛教徒的念珠. 从古至今人们为了美化人体本身,也美 化环 ...

  3. bzoj3198[Sdoi2013]spring 容斥+hash

    3198: [Sdoi2013]spring Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1143  Solved: 366[Submit][Sta ...

  4. BZOJ.2655.calc(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...

  5. BZOJ 4455: [Zjoi2016]小星星(容斥+树形dp)

    传送门 解题思路 首先题目中有两个限制,第一个是两个集合直接必须一一映射,第二个是重新标号后,\(B\)中两点有边\(A\)中也必须有.发现限制\(2\)比较容易满足,考虑化简限制\(1\).令\(f ...

  6. [SDOI2013]泉(容斥)

    /* 容斥加上哈希 首先我们可以2 ^ 6枚举相同情况, 然后对于这些确定的位置哈希一下统计方案数 这样我们就统计出了这些不同方案的情况, 然后容斥一下就好了 */ #include<cstdi ...

  7. BZOJ 2440 莫比乌斯函数+容斥+二分

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5473  Solved: 2679[Submit][Sta ...

  8. BZOJ 3771: Triple(FFT+容斥)

    题面 Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: "这把斧头,是不是你的?" 樵夫一看:&qu ...

  9. bzoj 2839 集合计数 容斥\广义容斥

    LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...

随机推荐

  1. 关于全志A20的Ubuntu12.04 64位系统下环境配置及编译过程笔记【转】

    本文转载自:https://blog.csdn.net/buqingbuyuan/article/details/43370199 在安装Ubuntu系统之后,安装编译所需的GCC等工具,一般选用GC ...

  2. 使用display:table使两栏布局高度相等

    两栏布局大家应该经常用了,但是遇到坑爹的要两栏的高度对齐的话要怎么办呢? <!DOCTYPE html> <html> <head> <meta charse ...

  3. oracle数据库插入优化

    通过程序要把1000万的数据插入到数据表中,刚开始每100条数据耗时50ms左右,但是越往后越慢,最慢到了十几秒的都有,真实好坑了. 于是在网上百度了一波,如何进行insert优化.倒是有了一点小小的 ...

  4. 分享知识-快乐自己:都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事

    都说新的Arraylist 扩容是(1.5倍+1) 看了1.8的源代码发现不是这么回事 就用下面这段代码在jdk的三个版本运行看了下效果: import java.lang.reflect.Field ...

  5. Ajax的跨域问题(包括解决方案)?

    原因:js的同源策略限制,不同源会造成跨域 哪些情况会造成跨域? 子域名不同(WWW) 2.主域名不同(baidu.com) 3.端口号不同 4.IP地址和网址不同 解决方案: 使用jsonp技术,但 ...

  6. 在SQL Server中快速删除重复记录

     在SQL Server中快速删除重复记录 2006-07-17 21:53:15 分类: SQL Server 开发人员的噩梦——删除重复记录 想必每一位开发人员都有过类似的经历,在对数据库进行查询 ...

  7. 条款19:定义class就相当于定义一个个的内置类型

    下面的条框应该是谨记的: 1. 新的type应该如何创建与销毁 2. 对象的初始化与赋值应该有什么样的区别 3. 新type的对象如果被pass-by-value,有什么影响? 4. 什么事新type ...

  8. Android中UI线程与后台线程交互设计的6种方法

    在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须要重新开启 一个后台线程运行这些任务.然而,往往这些任务最终又会直 ...

  9. 2017.11.17 Demo-stm8+temperature timeing control

    1Find the lab and add in project. Downtown  it from ST  official website..compile it to ensure it pa ...

  10. WEKA中的数据预处理

    数据预处理包括数据的缺失值处理.标准化.规范化和离散化处理. 数据的缺失值处理:weka.filters.unsupervised.attribute.ReplaceMissingValues. 对于 ...