topcoder srm 400 div1
problem1 link
枚举指数,然后判断是不是素数即可。
problem2 link
令$f[len][a][b][r]$(r=0或者1)表示子串$init[a,a+len-1]$匹配$goal[b,b+len-1]$,翻转了$r$次的最小代价。
problem3 link
答案的公式很容易推导,为$n*\sum_{i=n-k+1}^{n}\frac{1}{i}$.
调和级数为$H(n)=\sum_{i=1}^{n}\frac{1}{i}$
所以答案为$n*(H(n)-H(n-k))$
由于$n$较大,不能枚举,这里有它的近似公式:
$\frac{1}{24(n+1)^{2}}<H(n)-ln(n+\frac{1}{2})-\gamma<\frac{1}{24n^{2}}$
所以$H(n)-H(n-k)\approx ln(\frac{n+\frac{1}{2}}{n-k+\frac{1}{2}})=ln(\frac{2n+1}{2n-2k+1})$
所以对于$H(n)$的较小部分暴力,然后用近似公式。
code for problem1
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class StrongPrimePower { public int[] baseAndExponent(String n) {
final long m=Long.valueOf(n);
for(int i=2;i<=60;++i) {
final int k=cal(i,m);
if(k==-1) {
continue;
}
if(isprime(k)) {
return new int[]{k,i};
}
}
return new int[0];
} int cal(int k,long m) {
int low=1,high=(int)Math.sqrt(m)+1;
int result=1;
while(low<=high) {
int mid=(low+high)>>1;
if(pow(mid,k,m)>m) {
high=mid-1;
}
else {
result=Math.max(result,mid);
low=mid+1;
}
}
if(pow(result,k,m)==m) {
return result;
}
return -1;
} long pow(long a,long b,long n) {
long result=1;
while(b>0) {
if(1==(b&1)) {
if(result>n/a) {
return n+1;
}
result*=a;
if(b==1) {
return result;
}
}
if(a>n/a) {
return n+1;
}
a=a*a;
b>>=1;
}
return result;
} boolean isprime(int n) {
if(n==1) {
return false;
}
for(long i=2;i*i<=n;++i) {
if(n%i==0) {
return false;
}
}
return true;
}
}
code for problem2
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class ReversalChain { static final int INF=10000000; String init=null;
String goal=null;
int n;
int[][][][] f=null; public int minReversal(String init,String goal) {
this.init=init;
this.goal=goal;
n=init.length();
f=new int[n+1][n][n][2];
for(int i=0;i<n+1;++i) {
for(int j=0;j<n;++j) {
for(int k=0;k<n;++k) {
for(int t=0;t<2;++t) {
f[i][j][k][t]=-1;
}
}
}
}
int result=dfs(n,0,0,0);
if(result>=INF) {
return -1;
}
return result;
} int dfs(int len,int a,int b,int t) {
if(len==0) {
return 0;
}
if(len==1) {
return init.charAt(a)==goal.charAt(b)?0:INF;
}
if(f[len][a][b][t]!=-1) {
return f[len][a][b][t];
}
f[len][a][b][t]=INF; if(t==0) {
if(init.charAt(a)==goal.charAt(b)) {
f[len][a][b][t]=Math.min(f[len][a][b][t],dfs(len-1,a+1,b+1,0));
}
if(init.charAt(a+len-1)==goal.charAt(b+len-1)) {
f[len][a][b][t]=Math.min(f[len][a][b][t],dfs(len-1,a,b,0));
}
if(init.charAt(a)==goal.charAt(b+len-1)) {
f[len][a][b][t]=Math.min(f[len][a][b][t],dfs(len-1,a+1,b,1)+1);
}
if(init.charAt(a+len-1)==goal.charAt(b)) {
f[len][a][b][t]=Math.min(f[len][a][b][t],dfs(len-1,a,b+1,1)+1);
}
}
else {
if(init.charAt(a)==goal.charAt(b)) {
f[len][a][b][t]=Math.min(f[len][a][b][t],dfs(len-1,a+1,b+1,0)+1);
}
if(init.charAt(a+len-1)==goal.charAt(b+len-1)) {
f[len][a][b][t]=Math.min(f[len][a][b][t],dfs(len-1,a,b,0)+1);
}
if(init.charAt(a)==goal.charAt(b+len-1)) {
f[len][a][b][t]=Math.min(f[len][a][b][t],dfs(len-1,a+1,b,1));
}
if(init.charAt(a+len-1)==goal.charAt(b)) {
f[len][a][b][t]=Math.min(f[len][a][b][t],dfs(len-1,a,b+1,1));
}
} return f[len][a][b][t];
}
}
code for problem3
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class CollectingBonuses { final static int LIMIT=10000000; public double expectedBuy(String n, String k) {
long nn=Long.valueOf(n);
long mm=Long.valueOf(k);
long m=nn-mm+1;
double result=0;
while(m<=LIMIT) {
result+=1.0/m;
if(m==nn) {
return nn*result;
}
++m;
}
result+=Math.log1p((2*nn-2*m+2.0)/(2.0*m-1));
return nn*result;
}
}
topcoder srm 400 div1的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 635 div1
problem1 link 首先枚举长度$L$.然后计算每一段长度$L$的差值最大公约数,然后差值除以最大公约数的结果可以作为当前段的关键字.然后不同段就可以比较他们的关键字,一样就是可以转化的. p ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 605 DIV1
604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...
随机推荐
- Ecust DIV3 k进制 【暴力不断优化】
K进制 Description 给定一个正整数n,请你判断在哪些进制下n的表示恰好有2位是1,其余位都是0. Input 输入第一行为整数TT,表示有TT组数据(1 \le T \le 50)(1≤T ...
- TCP连接图示
转移2018.4.6 自己总结绘图
- 谈谈html中一些比较"偏门"的知识(map&area;iframe;label)
说明:这里所说的"偏门"只是相对于本人而言,记录在此,加深印象.也希望有需要的朋友能获得些许收获! 1.空元素(void):没有内容的元素. 常见的有:<br>,< ...
- Robot - 1. robot framework环境搭建
Fom:https://www.cnblogs.com/puresoul/p/3854963.html 一. robot framework环境搭建: 官网:http://robotframework ...
- 使用js实现登录随机验证码的效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 【2017-02-28】C# 冒泡排序
冒泡排序 重复地走访过要排序的数列,一次比较两个元素的大小,如果他们的顺序错误就把他们交换过来 通过两个For循环嵌套来实现 思路——以从小到大为例 第一个for循环抽取第一个数和第二个数进行比较,如 ...
- 爬取小说 spider
1.代码: # -*- coding:UTF- -*- from bs4 import BeautifulSoup import requests, sys """ 类说 ...
- python使用SAX解析xml
python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件 在python中使用sax方式处理xml要先引入xml.s ...
- 使用Fiddler测试WebApi接口
Fiddler是好用的WebApi调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据,Fiddler 是以代理web服务器的形式工作的,使用 ...
- 安装mysql警告 warning: mysql-community-server-5.7.19-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
摘自:https://www.cnblogs.com/royfans/p/7243641.html 红帽安装rpm安装MySQL时爆出警告: 警告:MySQL-server-5.5.46-1.linu ...