博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 3202 [Sdoi 2013] 项链 —— 置换+计数
阅读量:5332 次
发布时间:2019-06-14

本文共 2277 字,大约阅读时间需要 7 分钟。

题目:

参考了博客:

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

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

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

注意模 P 和模 mod 。

代码如下:

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

 

转载于:https://www.cnblogs.com/Zinn/p/10073897.html

你可能感兴趣的文章
L1-Day34
查看>>
Linux主机在LNMP环境中同时运行多个PHP版本
查看>>
玩转Xcode之修改系统生成的注释模板
查看>>
8、二进制中1的个数------------>剑指offer系列
查看>>
深入理解JavaScript系列(13):This? Yes,this!
查看>>
免费素材下载:一套超棒的免费UI套件
查看>>
jmeter中如何使用csv文件并读取数据
查看>>
ASP.NET MVC随记汇总
查看>>
Oracle查询经典
查看>>
$.ajax()方法详解
查看>>
一个view相对于屏幕或者另外一个view 的坐标
查看>>
典型系统~秒杀系统架构优化思路(转)
查看>>
codeforces 710C C. Magic Odd Square(构造)
查看>>
Node.js的UnitTest单元测试
查看>>
互联网业务安全实战
查看>>
[ Servlet / JSP ] J2EE Web Application 中的 JSESSIONID 是什么?
查看>>
MySQL thread pool【转】
查看>>
c++ _int64 转成string
查看>>
线性表类型的实现——————链表映像
查看>>
10.并发包阻塞队列之ArrayBlockingQueue
查看>>