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 ...
随机推荐
- ZOJ 3690 Choosing number(矩阵)
Choosing number [题目链接]Choosing number [题目类型]矩阵 &题解: 这题就和已经dp极像了,所以找方程就很困难了.可以这样找: 设f(n)是前n-1个人已经 ...
- MyBatis基础入门《十三》批量新增数据
MyBatis基础入门<十三>批量新增数据 批量新增数据方式1:(数据小于一万) xml文件 接口: 测试方法: 测试结果: =============================== ...
- win10 修改root文件
1.进入Win10系统的hosts文件所在位置,我们直接输入C:\Windows\System32\Drivers\etc后回车就可以打开了,右键hosts文件,选择属性 2.点击hosts属性对话框 ...
- callback源码分析——callbacks
uvm的callback必须是提供者有预见性的留一些方法在function前后,这样在使用的时候,进行遍历调度即可 设计者,需要从uvm_callback定义一个基类,只定义function原型,定义 ...
- QString和char*互转
1. QString转为char * // QString转QByteArray QByteArray sr = strQ.toLocal8Bit(); int len = sr.length(); ...
- 136. Single Number(位运算)
Given a non-empty array of integers, every element appears twice except for one. Find that single on ...
- 爬取笔下wenxue小说
import urllib.request from bs4 import BeautifulSoup import re def gethtml(url): page=urllib.request. ...
- yii2开启事务
public function actionAdd() { $model = new Goods(); $model->setScenario('insert'); if ($model-> ...
- jQuery筛选--hasClass(class)和eq(index|-index)
hasClass(class) 概述 检查当前的元素是否含有某个特定的类,如果有,则返回true 参数 class 用于匹配的类名 <!DOCTYPE html> <html> ...
- 【Hadoop学习之九】MapReduce案例分析一-天气
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 找出每个月气温最高的2天 1949 ...