bzoj 3202 [Sdoi 2013] 项链 —— 置换+计数
题目: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] 项链 —— 置换+计数的更多相关文章
- [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...
- BZOJ 3203 sdoi 2013 保护出题人
由于样例解释很清晰,所以很容易得到以下结论: 1.每一关都是独立的,且僵尸的相对位置不会变 2.每一关的攻击力=Max(sum(i)/dis(i)) 其实sum(i)是僵尸攻击力的前缀和,dis(i) ...
- [BZOJ 3167][HEOI 2013]SAO
[BZOJ 3167][HEOI 2013]SAO 题意 对一个长度为 \(n\) 的排列作出 \(n-1\) 种限制, 每种限制形如 "\(x\) 在 \(y\) 之前" 或 & ...
- [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)
[BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap)
[BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap) 题面 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数 ...
- BZOJ 3236 AHOI 2013 作业 莫队+树状数组
BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...
- [BZOJ 3144][HNOI 2013] 切糕
题目大意 切糕是 (p times q times r) 的长方体,每个点有一个违和感 (v_{x, y, z}).先要水平切开切糕(即对于每个纵轴,切面与其有且只有一个交点),要求水平上相邻两点的切 ...
- bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 可见Zinn博客:https://www.cnblogs.com/Zinn/p/100 ...
随机推荐
- Linux Shell基础 read命令
read命令 read 命令用于接收标准输入(键盘)的输入,或者其他文件描述符的输入.得到输入后,read 命令将数据放入一个标准变量中,read 命令格式如下: [root@localhost ~] ...
- 建议13:使用Python模块re实现解析小工具
# -*- coding:utf-8 -*- # ''' Python re 的主要功能: re.compile(pattern[, flags]) 把正则表达式的模式和标识转化成正则表达式对象,供 ...
- HAproxy 源码包安装
HAproxy 源码包安装 系统环境:Centos 7 x64位 服务版本:haproxy-1.7.8.tar.gz 编译工具:gcc 下载地址 HAproxy:https://pan.baidu.c ...
- LVS 负载均衡原理详解
LVS简介 LVS是一个开源软件,由章文嵩博士于1998年5月创立,可以实现Linux平台下的简单负载均衡.LVS是Linux Virtual Server的简写,是一个虚拟的服务器集群系统. LVS ...
- DP问题分类总结
http://m.blog.csdn.net/y990041769/article/details/24194605 此博客总结了动态规划相关问题,学习一下!
- BZOJ 1941 kd-tree
模板题 题意说的可能有点不清楚 一开始的点必须在给定的n个点里面 所以枚举点 然后ask最大和最小值 估价函数中 最大值的写法和最小值不同 全部取max 而最小值在估价时 如果在某个点管辖的空间里 就 ...
- Java编程思想 两个主函数
//: initialization/DynamicArray.javapackage initialization; /* Added by Eclipse.py */// Array initia ...
- boot小知识
lg 大, md 中等, sm 小, xs 极小. 可以单独用,也可以混合用,不同的屏幕用不同的比例. push ,pull 推拉.这个不实用. row里面可以嵌套实用row. 挤不下的时候,就会自动 ...
- pandas读取Excel
time31 = pd.read_excel('F:/save_file/3问出车表.xlsx', sheetname='Sheet1') # 读取‘3问出车表.xlsx’中的Sheet1表单, ti ...
- setintervalue传参数的三种方法
http://www.cnblogs.com/wkylin/archive/2012/09/07/2674911.html http://www.bhcode.net/article/20110822 ...