今天挂的有点惨……

T1.forging

这道题自己在考试的时候想出来了……

这题是一个期望递推。我们首先考虑这么一件事,一枚硬币,你抛到正面停止,抛到反面继续抛,问期望抛的次数。是两次。我们假设期望抛x次,因为期望对于后面没有影响,所以有如下方程:

x = 0.5 × 0 + 0.5 × x + 1,x = 2.

那么我们就可以通过当前合成的概率知道合成的期望次数了。然后一次合成我们需要一把i级的武器,我们只需要1把i-2级的武器和期望次数把的i-1级的武器,所以我们就可以这样递推计算,然后结束。

结果一是因为自己智障的在两个0级刀合成的时候忘记取max,加上自己空间开的过大,100变0分可还行。

看下std……自己改完的代码好像丢了……

#include<cmath>
#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
typedef long long ll;
const int p=;
const int N=1e7+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int inv[N],b[N],c[N],f[N];
inline int sub(int x,int y){
x-=y;if(x<)x+=p;return x;
}
int main(){
freopen("forging.in","r",stdin);freopen("forging.out","w",stdout);
inv[]=;
for(int i=;i<N;i++)inv[i]=(ll)(p-p/i)*inv[p%i]%p; int n=read();f[]=read();
int bx=read(),by=read(),cx=read(),cy=read(),mod=read();
b[]=by+;c[]=cy+;
for(int i=;i<n;i++){
b[i]=((ll)b[i-]*bx+by)%mod+;
c[i]=((ll)c[i-]*cx+cy)%mod+;
}
f[]=(ll)((ll)c[]*inv[min(b[],c[])]%p+)*f[]%p;
for(int i=;i<=n;i++)
f[i]=((ll)c[i-]*inv[min(b[i-],c[i-])]%p*f[i-]%p+f[i-])%p;
printf("%d\n",f[n]);
return ;
}

T2.division

这道题当时做的时候没想出来什么……于是好像写了个暴力骗了20。

后来学姐说是CRT……?没大听懂,copy一下题解……

std:

#include <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
using namespace std;
template<class T>
void read(T &res)
{
res = ;
char c = getchar();
T f = ;
while(c < '' || c > '')
{
if(c == '-') f = -;
c = getchar();
}
while(c >= '' && c <= '')
{
res = res * + c - '';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x)
{
if(x < )
{
putchar('-');
x = -x;
}
if(x >= )
{
out(x / );
}
putchar('' + x % );
}
int id;
int a[],tot,prime[];
bool nonprime[];
int mul(int a,int b,int MOD)
{
return 1LL * a * b % MOD;
}
int fpow(int x,int c,int MOD)
{
int res = ,t = x;
while(c)
{
if(c & ) res = res * t % MOD;
t = t * t % MOD;
c >>= ;
}
return res;
}
int Calc(int p,int m)
{
memset(nonprime,,sizeof(nonprime));
tot = ;
a[] = ;
a[p] = ;
for(int i = ; i < p ; ++i)
{
if(!nonprime[i])
{
a[i] = fpow(i,m,p);
prime[++tot] = i;
}
for(int j = ; j <= tot ; ++j)
{
if(i * prime[j] > ) break;
a[i * prime[j]] = a[i] * a[prime[j]] % p;
nonprime[i * prime[j]] = ;
if(i % prime[j] == ) break;
}
}
int res = ;
for(int i = ; i <= p ; ++i)
{
int t = a[i] - i + p;
if(t >= p) t -= p;
res += (t == );
}
return res;
}
void Solve()
{
int ans = ;
int c,m;
read(c);
read(m);
int p = ;
for(int i = ; i <= c ; ++i)
{
read(p);
ans = mul(ans,Calc(p,m),);
}
out(ans);
enter;
}
int main()
{
freopen("division.in","r",stdin);
freopen("division.out","w",stdout);
read(id);
int T;
read(T);
while(T--) Solve();
}

T3.money

这道题仍然是不会的状态……考试的时候骗到了10分。

正解是用倍增求出链上最小值,然后合并的时候启发式合并,用倍增记一下边的方向(???)

表示还是不懂……看一下std吧orz

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cassert>
#define space putchar(' ')
#define enter putchar('\n')
typedef long long ll;
using namespace std;
template <class T>
void read(T &x){
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
} const int N = , INF = 0x3f3f3f3f;
int n, m, lastans;
int ecnt, nxt[*N], go[*N], adj[N], edir[*N], emi[*N];
int sze[N], bel[N], dep[N];
int anc[N][], mi[N][], dir[N][]; void out(){
for(int i = ; i <= n; i++)
for(int j = ; anc[i][j]; j++)
printf("anc[%d][%d] = %d, dir = %d, mi = %d\n", i, j, anc[i][j], dir[i][j], mi[i][j]);
} void adde(int u, int v, int d, int w){
go[++ecnt] = v;
nxt[ecnt] = adj[u];
adj[u] = ecnt;
edir[ecnt] = d;
emi[ecnt] = w;
}
void dfs(int u, int pre, int rt){
bel[u] = rt;
dep[u] = dep[pre] + ;
for(int i = ; i < ; i++){
anc[u][i + ] = anc[anc[u][i]][i];
mi[u][i + ] = min(mi[u][i], mi[anc[u][i]][i]);
dir[u][i + ] = dir[u][i] | dir[anc[u][i]][i];
}
for(int e = adj[u], v; e; e = nxt[e])
if((v = go[e]) != pre){
anc[v][] = u;
mi[v][] = emi[e];
dir[v][] = edir[e] ^ ;
dfs(v, u, rt);
}
}
void add(int u, int v, int w){
adde(u, v, , w);
adde(v, u, , w);
int d = sze[bel[u]] > sze[bel[v]] ? : ;
if(d == ) swap(u, v);
anc[u][] = v, mi[u][] = w, dir[u][] = d;
sze[bel[v]] += sze[bel[u]];
dfs(u, v, bel[v]);
}
int query(int u, int v){
if(bel[u] != bel[v]) return ;
int d = , ret = INF;
if(dep[u] > dep[v])
swap(u, v), d = ;
for(int i = ; i >= ; i--)
if(dep[v] - ( << i) >= dep[u]){
if(dir[v][i] != ( ^ d)) return ;
ret = min(ret, mi[v][i]);
v = anc[v][i];
}
if(u == v) return ret;
for(int i = ; i >= ; i--)
if(anc[u][i] != anc[v][i]){
if(dir[v][i] != ( ^ d) || dir[u][i] != ( ^ d)) return ;
ret = min(ret, min(mi[v][i], mi[u][i]));
u = anc[u][i];
v = anc[v][i];
}
if(dir[v][] != ( ^ d) || dir[u][] != ( ^ d)) return ;
ret = min(ret, min(mi[v][], mi[u][]));
return ret;
} int main(){
freopen("money.in", "r", stdin);
freopen("money.out", "w", stdout);
read(n), read(m);
for(int i = ; i <= n; i++)
bel[i] = i, sze[i] = ;
int op, a, b, c;
while(m--){
read(op), read(a), read(b);
a = (a + lastans) % n + ;
b = (b + lastans) % n + ;
if(op == ) read(c), c = (c + lastans) % n + , add(a, b, c);
else write(lastans = query(a, b)), enter;
} return ;
}

2018.09.09 DL24 Day2总结的更多相关文章

  1. Trusted Block Chain Summit(2018.10.09)

    时间:2018.10.09地点:北京金隅喜来登大酒店

  2. c#用正则表达式判断字符串是否全是数字、小数点、正负号组成 Regex reg = new Regex(@"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$");

    Regex reg = new Regex(@"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][ ...

  3. 2018.09.08 DL24 Day1 总结

    补一下之前的总结…… T1.restaurant 这道题还是很简单的嘛,子恒dalao非常良心.我们把招牌菜和所需要的菜品绑定在一起就成了完全背包,然后直接跑一遍完全背包即可. #include< ...

  4. 1.用代码演示String类中的以下方法的用法 (2018.08.09作业)

    public class Test_001 { public static void main(String[] args) { String a = "德玛西亚!"; Strin ...

  5. 【2018.05.09 Python学习及实践】个人项目中使用的Python库备忘-持续更新

    科研中无论是使用C/C++.Python.Matlab,如果能找到合适的库可谓是事半功倍: 有时候忙活半天才发现本身就有成熟的库可用,自己实现的在功能.性能.安全性上都远远不及,虽然锻炼了能力,但存在 ...

  6. 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)

    传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ...

  7. 2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)

    传送门 先把边双连通分量用圆方树一样的方法缩点,然后把新建的树树剖维护. 注意对于边双连通分量需要维护动态最小值,可以用multisetmultisetmultiset. 代码: #include&l ...

  8. 2018.11.09 bzoj4773: 负环(倍增+floyd)

    传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ...

  9. 2018.11.09 bzoj2165: 大楼(倍增+floyd)

    传送门 先倍增出iii使得2i2^i2i时间时刚好有每个点能够到mmm层及以上. 然后就可以用floyd+floyd+floyd+倍增求出刚好不超过mmm层的时间,最后再补一层就行了. 代码: #pr ...

随机推荐

  1. PHP实现定时任务的几种方式

    关于定时任务,之前以前认识了一种最常用的:crontab定时任务.通过linux的定时任务去实现.今天又认识了一下php实现定时方式的其它方式,总结一下. 一 服务器定时任务 服务器定时任务,其实就是 ...

  2. PHP 处理接口保证数据安全性

    原地址:http://blog.csdn.net/lhbeggar/article/details/46377653 php做APP接口时,如何保证接口的安全性? 1.当用户登录APP时,使用http ...

  3. Spider-scrapy日志处理

    Scrapy生成的调试信息非常有用,但是通常太啰嗦,你可以在Scrapy项目中的setting.py中设置日志显示等级: LOG_LEVEL = 'ERROR' 日志级别 Scrapy日志有五种等级, ...

  4. python接口测试之序列化与反序列化(四)

    在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式 字符串解码为python数据对象.在python的标准库中,专门提供了jso ...

  5. java程序验证用户名密码和验证码登录的小例子

    package Study02; import java.util.Random; import java.util.Scanner; public class test { static Strin ...

  6. 1002. A+B for Polynomials (25) (浮点数判0)

    This time, you are supposed to find A+B where A and B are two polynomials. Input Each input file con ...

  7. CSU 1225 最长上升子序列并记录其个数

    ;j<i;j++){ if(h[i] > h[j]){ ) cnt[i]+=cnt[j]; ) len[i] = len[j] + , cnt[i] = cnt[j]; } //身高相同的 ...

  8. Spring data jpa 复杂动态查询方式总结

    一.Spring data jpa 简介 首先我并不推荐使用jpa作为ORM框架,毕竟对于负责查询的时候还是不太灵活,还是建议使用mybatis,自己写sql比较好.但是如果公司用这个就没办法了,可以 ...

  9. 详解SpringBoot集成jsp(附源码)+遇到的坑

    本文介绍了SpringBoot集成jsp(附源码)+遇到的坑 ,分享给大家 1.大体步骤 (1)创建Maven web project: (2)在pom.xml文件添加依赖: (3)配置applica ...

  10. codeforces 691D(数据结构)

    D. Swaps in Permutation time limit per test 5 seconds memory limit per test 256 megabytes input stan ...