zoukankan      html  css  js  c++  java
  • 【POJ2154】Color Pólya定理+欧拉函数

    【POJ2154】Color

    题意:求用$n$种颜色染$n$个珠子的项链的方案数。在旋转后相同的方案算作一种。答案对$P$取模。
    询问次数$le 3500$,$nle 10^9,Ple 30000$
    题解:旋转i次的循环个数显然是$gcd(i,n)$,然后套用Pólya定理。
    $$ans=frac 1 n sumlimits_{i=1}nn{gcd(i,n)}$$
    $$ans=sumlimits_{i=1}nn{gcd(i,n)-1}$$
    $$ans=sumlimits_{i=1}nsumlimits_{d|n}n{d-1}[gcd(i,n)=d]$$
    $$ans=sumlimits_{d|n}n{d-1}sumlimits_{i=1}{nover d}[gcd(i,{nover d})=1]$$
    $$ans=sumlimits_{d|n}n^{d-1}varphi({nover d})$$
    枚举约数即可。

    #include <cstring>
    #include <iostream>
    #include <cstdio>
    using namespace std;
    const int maxn=100010;
    typedef long long ll;
    int n,P,T,m,ans;
    int cnt[100],pri[100];
    inline int phi(int x)
    {
    	int i,ret=1;
    	for(i=2;i*i<=x;i++)	if(x%i==0)
    	{
    		ret=ret*(i-1),x/=i;
    		while(x%i==0)	ret=ret*i,x/=i;
    	}
    	if(x>1)	ret=ret*(x-1);
    	return ret;
    }
    inline int pw(int x,int y)
    {
    	x%=P;
    	int z=1;
    	while(y)
    	{
    		if(y&1)	z=z*x%P;
    		x=x*x%P,y>>=1;
    	}
    	return z;
    }
    void dfs(int x,int d)
    {
    	if(x==m+1)
    	{
    		ans=(ans+phi(n/d)%P*pw(n,d-1))%P;
    		return ;
    	}
    	for(int i=0;i<=cnt[x];i++,d*=pri[x])	dfs(x+1,d);
    }
    void work()
    {
    	scanf("%d%d",&n,&P),ans=m=0;
    	int i,t=n;
    	for(i=2;i*i<=t;i++)	if(t%i==0)
    	{
    		cnt[++m]=0,pri[m]=i;
    		while(t%i==0)	t/=i,cnt[m]++;
    	}
    	if(t>1)	pri[++m]=t,cnt[m]=1;
    	dfs(1,1);
    	printf("%d
    ",ans);
    }
    int main()
    {
    	scanf("%d",&T);
    	while(T--)	work();
    	return 0;
    }//1 2 30000
    
  • 相关阅读:
    HDU 5171
    HDU 3709
    HDU 3652
    HDU 3555
    【10】梯度消失和爆炸;梯度检验
    【9】归一化输入与标准化
    【8】正则化
    【7】偏差、方差;过拟合、欠拟合
    【6】深层神经网络的前向与反向传播
    【5】激活函数的选择与权值w的初始化
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/8227363.html
Copyright © 2011-2022 走看看