UVa:10294 Arif in Dhaka (First Love Part 2)

Polya定理。

先用一个置换的循环节数得到不动点数,由于这个题里面的置换都相同,可以得到全部置换的不动点数和,最后除以所有置换个数。

计算置换的循环节有多种办法,可以用数学推导也可以模拟计算。

题目中有提示是不会溢出的。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
//#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#define ll long long
#define INF 2139062143
#define MOD 20071027
#define MAXN 1000
using namespace std;
ll pow[MAXN];
ll gcd(ll a,ll b)
{
    return !b?a:gcd(b,a%b);
}
int main()
{
    int n,t;
    pow[0]=1;
    while(scanf("%d%d",&n,&t)!=EOF)
    {
        for(int i=1; i<=n; ++i) pow[i]=pow[i-1]*t;
        ll a=0,b=0;
        for(int i=0; i<n; ++i) a+=pow[gcd(i,n)];
        if(n%2) b=n*pow[(n+1)/2];
        else b=(n/2)*(pow[n/2+1]+pow[n/2]);
        printf("%lld %lld\n",a/n,(a+b)/2/n);
    }
    return 0;
}


 

你可能感兴趣的:(UVa:10294 Arif in Dhaka (First Love Part 2))