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 ...
随机推荐
- bex5部署后不更新
哪个模块没更新,就编译哪个模块 在x5/tools/compile下,运行对应模块的bat,并清空浏览器缓存 如果修改了.w文件,也可以删除相应的.catch文件夹 和.release文件夹,并且注意 ...
- Python编程-网络编程进阶(IO复用、Socketserver)
一.认证客户端的链接合法性 如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用hmac+加盐的方式来实现. 服务端 from socket import * imp ...
- 快乐学习 Ionic Framework+PhoneGap 手册1-3 {面板切换}
编程的快乐和乐趣,来自于能成功运行程序并运用到项目中,会在后面案例,实际运用到项目当中与数据更新一起说明 从面板切换开始,请看效果图和代码,这只是一个面板切换的效果 Index HTML Code & ...
- php数组函数-array_merge()
array_merge()函数把两个或多个数组合并为一个数组. 如果键名有重复,该键的键值为最后一个键名对应的值.如果数组是数字 索引,则键名会以连续方式重新索引. 注:如果仅仅向array_merg ...
- Git使用http clone客户端保存用户名密码
使用Git Bash时,用命令git pull或git push时总是要输入密码,很烦躁 解决办法 需要注意的是,这个方法是在Windows下使用 1. 新建环境变量 HOME 值为 %USERP ...
- mysql基础(5)-关联(mysql+pandas)
表关联类型 内连接: 仅显示满足条件的行 From T1,T2 where T1.ID=T2.ID From T1 inner join T2 ON T1.ID=T2.ID 左连接: 显示左表T1中的 ...
- Oracle给不同组数据添加顺序
SELECT DENSE_RANK() OVER(ORDER BY TABLESPACE_NAME),T.* FROM USER_TABLES T;
- POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并
看到讲课安排上 线段树有一节课"区间合并" 我是迷茫的 因为并没有见过 然后了解了一下题目 发现以前写过 还是很麻烦的树链剖分 大概是 解决带修改的区间查询"连续问题&q ...
- Apache虚拟主机配置模板
/////////////////////////////////写在前头////////////////////////////////////////1.Apache HTTP 服务器2.4文档: ...
- npm全局安装
时间长了,很多东西都忘了. 全局安装以后,在你自己的电脑任何位置都可以使用的包.直接用命令使用的: 比如:supervisor mok 还有cnpm,express之类的.gulp之类的. 剩下的我们 ...