《算法竞赛入门经典:训练指南》上的例题。
顺便做了 UVa11762:
P143 , 期望 Dp
Uva10294,11077,LA3641:
P146 ~ 149 , Polya 定理
Uva11762
#include
#include
#include
#include
const int maxn = 1e6+4;
int prime[maxn], tot;
bool check[maxn];
double f[maxn];
bool vis[maxn];
void PreWork()
{
for(int i = 2; i < maxn; i++)
{
if(!check[i]) prime[++tot] = i;
for(int j = 1; j <= tot && i*prime[j] < maxn; j++)
{
check[i*prime[j]] = true;
if(!(i%prime[j])) break;
}
}
}
double dp(int x)
{
if(x == 1) return 0;
if(vis[x]) return f[x];
vis[x] = true;
double &ans = f[x];
int g = 0, p = 0;
ans = 0;
for(p = 1; p <= tot && prime[p] <= x; p++)
if(!(x%prime[p])) ans += dp(x/prime[p]), g++;
ans = (ans + (--p))/g;
return ans;
}
int main()
{
int T;
#ifndef ONLINE_JUDGE
freopen("uva11762.in","r",stdin);
freopen("uva11762.out","w",stdout);
#endif
PreWork(), std::cin >> T;
for(int i = 1, q; i <= T; i++)
scanf("%d",&q), printf("Case %d: %.10lf\n", i, dp(q));
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
LA3641
#include
#include
#include
#include
void Solve()
{
char str[30] = {'\0'};
bool hash[30] = {false};
int cnt[30] = {0};
bool flag = true;
std::cin >> str;
for(int i = 0; i < 26; i++)
if(!hash[i])
{
int len = 0;
for(int j = i; !hash[j]; len++)
hash[j] = true, j = str[j]-'A';
cnt[len]++;
}
for(int i = 2; i <= 26; i += 2)
if(cnt[i]&1) {flag = false; break;}
if(flag) std::cout << "Yes" << std::endl;
else std::cout << "No" << std::endl;
}
int main()
{
int T;
#ifndef ONLINE_JUDGE
freopen("LA3641.in","r",stdin);
freopen("LA3641.out","w",stdout);
#endif
std::cin >> T;
while(T--) Solve();
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
UVa10294
#include
#include
#include
#include
int n, t;
long long power(int x,int y)
{
long long ret = 1;
while(y--) ret *= x;
return ret;
}
int gcd(int x,int y)
{
if(!y) return x;
return gcd(y,x%y);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("uva10294.in","r",stdin);
freopen("uva10294.out","w",stdout);
#endif
while(~scanf("%d",&n))
{
long long a = 0, b = 0;
std::cin >> t;
for(int i = 0; i < n; i++) a += power(t,gcd(i,n));
if(n&1) b = n *power(t,(n+1)>>1);
else b = (n>>1)*(power(t, (n>>1)+1) + power(t, n>>1));
std::cout << a/n << ' ' << (((a+b)/n)>>1) << std::endl;
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
UVa11077
#include
#include
#include
#include
const int maxn = 30;
int n, k;
unsigned long long f[maxn][maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("uva11077.in","r",stdin);
freopen("uva11077.out","w",stdout);
#endif
f[1][0] = 1;
for(int i = 2; i <= 21; i++)
for(int j = 0; j < i; j++)
f[i][j] = f[i-1][j] + ((j)?f[i-1][j-1]*(i-1):0);
while(true)
{
std::cin >> n >> k;
if(!(n+k))break;
std::cout << f[n][k] << std::endl;
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
}