Description

有一个长度为N的环,上面写着’X’和’E’,问本质不同的环有多少种。(N不超过200000)。

Input

The input file contains a single integer 1 <= n <= 200000.

Output

Output a single integer --- the number circular strings of length n.

Sample Input

3

Sample Output

4


polya裸题,和[POJ2154]Color一样,只是需要带个高精度罢了,只有两种颜色,不用取模

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=2e5;
const int base=1e4;
const int digit=4;
const int maxn=1e2;
struct Bignum{
int len,v[maxn];
Bignum(){len=1,memset(v,0,sizeof(v));}
void init(){v[0]=1;}
void write(){
printf("%d",v[len-1]);
for (int i=len-2;~i;i--) printf("%0*d",digit,v[i]);
putchar('\n');
}
};
int prime[N+10],phi[N+10];
bool inprime[N+10];
int tot;
void prepare(){
phi[1]=1;
for (int i=2;i<=N;i++){
if (!inprime[i]) prime[++tot]=i,phi[i]=i-1;
for (int j=1;j<=tot&&prime[j]*i<=N;j++){
inprime[prime[j]*i]=1;
if (i%prime[j]==0) phi[i*prime[j]]=phi[i]*prime[j];
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
Bignum operator +(const Bignum &x,const Bignum &y){
Bignum z;
z.len=max(x.len,y.len);
for (int i=0;i<=z.len;i++) z.v[i]+=x.v[i]+y.v[i],z.v[i+1]+=z.v[i]/base,z.v[i]%=base;
while (z.v[z.len]) z.v[z.len+1]+=z.v[z.len]/base,z.v[z.len]%=base,z.len++;
return z;
}
Bignum operator *(const Bignum &x,const Bignum &y){
Bignum z;
z.len=x.len+y.len;
for (int i=0;i<=x.len;i++)
for (int j=0;j<=y.len;j++)
z.v[i+j]+=x.v[i]*y.v[j],z.v[i+j+1]+=z.v[i+j]/base,z.v[i+j]%=base;
while (z.len!=1&&!z.v[z.len]) z.len--;z.len++;
while (z.v[z.len]) z.v[z.len+1]+=z.v[z.len]/base,z.v[z.len]%=base,z.len++;
return z;
}
Bignum operator /(Bignum &x,int y){
for (int i=x.len;~i;i--) x.v[i-1]+=x.v[i]%y*base,x.v[i]/=y;
while (x.len!=1&&!x.v[x.len]) x.len--;
while (x.v[x.len]) x.v[x.len+1]+=x.v[x.len]/base,x.v[x.len]%=base,x.len++;
return x;
}
Bignum mlt(Bignum a,int b){
Bignum res;res.init();
for (;b;b>>=1,a=a*a) if (b&1) res=res*a;
return res;
}
Bignum change(int x){
Bignum z;
while (x){
z.v[z.len-1]=x%base;
z.len++;
x/=base;
}
while (z.len!=1&&!z.v[z.len]) z.len--;
while (z.v[z.len]) z.v[z.len+1]+=z.v[z.len]/base,z.v[z.len]%=base,z.len++;
return z;
}
int main(){
prepare();
int n=read();
Bignum Two,Ans;
Two.v[0]=2;
for (int i=1;i*i<=n;i++){
if (n%i) continue;
int j=n/i;
Ans=Ans+mlt(Two,i)*change(phi[j]);
if (i!=j) Ans=Ans+mlt(Two,j)*change(phi[i]);
}
Ans=Ans/n;
Ans.write();
return 0;
}

Sgu294He's Circles的更多相关文章

  1. UVa247 Calling Circles

    Time Limit: 3000MS     64bit IO Format: %lld & %llu map存人名,floyd传递闭包,DFS查询. 输出答案的逗号后面还有个空格,被坑到了2 ...

  2. zw版【转发·台湾nvp系列Delphi例程】HALCON 3D Position Of Circles

    zw版[转发·台湾nvp系列Delphi例程]HALCON 3D Position Of Circles procedure TForm1.action();var ho_Image, ho_Elli ...

  3. UVa 247 Calling Circles【传递闭包】

    题意:给出n个人的m次电话,问最后构成多少个环,找出所有的环 自己想的是:用map来储存人名,每个人名映射成一个数字编号,再用并查集,求出有多少块连通块,输出 可是map不熟,写不出来,而且用并查集输 ...

  4. uva247 - Calling Circles(传递闭包+DFS)

    题意:两人相互打电话(直接或间接),则在一个电话圈.即a给b打电话,b给c打电话,则a给c间接打电话. 注意:1.注意标记.2.注意输出格式. #include<iostream> #in ...

  5. UVa 247 (传递闭包) Calling Circles

    题意: 有n个人m通电话,如果有两个人相互打电话(直接或间接)则在同一个电话圈里.输出所有电话圈的人的名单. 分析: 根据打电话的关系,可以建一个有向图,然后用Warshall算法求传递闭包. 最后输 ...

  6. 计数方法,博弈论(扫描线,树形SG):HDU 5299 Circles Game

    There are n circles on a infinitely large table.With every two circle, either one contains another o ...

  7. 数学计数原理(Pólya,高精度):SGU 294 He's Circles

      He's Circles He wrote n letters "X" and "E" in a circle. He thought that there ...

  8. UVA247- Calling Circles(有向图的强连通分量)

    题目链接 题意: 给定一张有向图.找出全部强连通分量,并输出. 思路:有向图的强连通分量用Tarjan算法,然后用map映射,便于输出,注意输出格式. 代码: #include <iostrea ...

  9. [Uva247][Tarjan求强连通分量][Calling Circles]

    题目大意: 例如:A跟B打电话,B跟C打电话,C跟A打电话..D跟E打电话,E跟D不打电话.则A,B,C属于同一个电话圈,D,E分别属于一个电话圈,问有多少个电话圈. 分析 就是裸的求强连通分量,直接 ...

随机推荐

  1. hdu 4057 Rescue the Rabbit

    题意 给出n(n<=10)个串,每个串有个权值,然后让你构造一个长度为l(l<=100)的串,如果他包含给出的串就得到相应的权值,求可能得到的最大权值 解法 AC自动机+DP,很显然要建立 ...

  2. Android TextView设置个别字体样式

    TextView进一步深化:       Textview 能够对其文字进行格式化.       通过查询资料,了解到格式化文字的方式主要分为两大类:  第一类:HTML标签格式化文字      代码 ...

  3. Angular结构简单介绍

    在当前项目目录下,使用Angular-CLI生成一个组件:heroes ng generate component heroes 主界面(也就是一个主模块+多个单模块,例如我们创建的heroes(单模 ...

  4. REST技术第四步 多个參数注解问题

    经过实验,发如今使用@BeanParam注解的查询类字段上. @FormParam和@QueryParam不能同一时候加上去,仅仅能加一个,否则会出现取不到数据的情况. 并且在方法參数上两个注解也不能 ...

  5. Opengl ES 1.x NDK实例开发之七:旋转的纹理立方体

    开发框架介绍请參见:Opengl ES NDK实例开发之中的一个:搭建开发框架 本章在第六章(Opengl ES 1.x NDK实例开发之六:纹理贴图)的基础上绘制一个旋转的纹理立方体,原理和纹理贴图 ...

  6. Ubuntu16.04 下python2 | python3

    在终端分别输入python,python2,python3 python和python2默认都是python2 python3才是python3 Ubuntu下是默认没有pip的,需要自己手动安装 s ...

  7. Android调用本地WebService

    package com.example.testinvokewebservice; import org.ksoap2.SoapEnvelope; import org.ksoap2.serializ ...

  8. ranlib

    1 ranlib的缩写 random access library 2 ranlib的作用 为静态库的符号建立索引,可以加速链接,因此称用ranlib处理过的library为random access ...

  9. C++明确规定,不能获取构造函数和析构函数的地址

    C++标准明确规定,不能获取构造函数和析构函数的地址,因此也无法形成指向他们的成员函数指针. 指向成员函数的指针可以,指向构造函数析构函数的不行.因为构造函数和析构函数都是没有返回值的,无法声明一个没 ...

  10. Enum的基本使用

    package enum_test; public enum Shrubbery { GROUND, CRAWLING, HANGING } package enum_test; public cla ...