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 ...
随机推荐
- MySQL.ERROR 1133 (42000): Can't find any matching row in the user table
ERROR 1133 (42000): Can't find any matching row in the user table 今天在执行 grant all privileges on cac ...
- Struts上传文件
Struts上传文件分为两个步骤: 1). 首先将客户端上传的文件保存到Struts.multipart.saveDir键所指定的目录中,如果该键所对应的目录不存在,那么就保存到javax.servl ...
- 【Linux学习六】用户管理
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.增加删除用户或组新增用户useradd scott修改用户密码pa ...
- JAVA基础3---JVM内存模型
Java虚拟机执行Java程序的时候需要使用一定的内存,根据不同的使用场景划分不同的内存区域.有公用的区域随着Java程序的启动而创建:有线程私有的区域依赖线程的启动而创建 JVM内存模型大致可以分为 ...
- linux python虚拟环境 相关的
为什么要用虚拟环境 在使用python开发过程中,各种业务需求多了,导致工程任务多了,难免会碰到不同的工程依赖不同版本库的问题,;或者是在开发的时候不想让物理环境里充斥各种各样的库,引发依赖环境灾难, ...
- Codeforce 296A - Yaroslav and Permutations
Yaroslav has an array that consists of n integers. In one second Yaroslav can swap two neighboring a ...
- PDF文档导出
代码如下: /// <summary> /// 获取html内容,转成PDF(注册) /// </summary> public void DownloadPDFByHTML( ...
- BATJ等大厂最全经典面试题分享
金九银十,又到了面试求职高峰期,最近有很多网友都在求大厂面试题.正好我之前电脑里面有这方面的整理,于是就发上来分享给大家. 这些题目是网友去百度.蚂蚁金服.小米.乐视.美团.58.猎豹.360.新浪. ...
- ads查询结果中文显示方框问题
刚安装aqua data studio查询结果中文会变成小方框 选择File -->Options 找到General -->Appearance,把Editor Font , Text ...
- MyBatis中#{ }和${ }的区别,数据库优化遵循层次和查询方法
MyBatis中#{ }和${ }的区别详解 1.#将传入的数据当成一个字符串,会对自动传入的数据加一个 双引号. 例如order by #id#,如果传入的值是111,那么解析成sql时变为orde ...