今天挂的有点惨……

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:现有图片验证码类

    文章来源:http://www.cnblogs.com/hello-tl/p/7593022.html <?php class TL_Captcha_img{ private $image; / ...

  2. Python接口测试中通过登录接口获取实时token

    1.封装login_token 2.headers:对应登录请求头部信息 3.request_param:登录的参数数据 4.json.dumps:将一个Python数据结构转换为JSON 5.dic ...

  3. linux上uwsgi+nginx+django发布项目

    在发布项目前首先将部署环境进行搭建,尤其是依赖包一定需要提前安装. 一.虚拟环境的搭建 1.建议在linux下新建一个虚拟环境,这样有独立干净的环境. mkvirtualenv -p python3 ...

  4. rbac组件之菜单操作(三)

    菜单包括菜单列表,菜单列表不仅将菜单列出来,而且将每个菜单下的权限也列出来.菜单的添加.删除.修改. urls.py ... re_path(r'^menus/list/$', MenuView.as ...

  5. (八)python3 迭代

    迭代:如果给定一个 list 或 tuple,我们可以通过 for 循环来遍历这个 list 或tuple,这种遍历我们称为迭代(Iteration) 字典: >>> d = {'a ...

  6. day 21 03 补全异常处理

    day 21 03  异常处理(补全) 1.异常处理的整体几个语句: try: .......#有可能出错的代码 ret=int(input('number >>>')) print ...

  7. 第十七节:Scrapy爬虫框架之item.py文件以及spider中使用item

    Scrapy原理图: item位于原理图的最左边 item.py文件是报存爬取数据的容器,他使用的方法和字典很相似,但是相比字典item多了额外的保护机制,可以避免拼写错误或者定义错误. 1.创建it ...

  8. Jquery validate自定义验证

    http://www.runoob.com/jquery/jquery-plugin-validate.html addMethod(name,method,message)方法 参数 name 是添 ...

  9. [luoguP1011] 车站(递推)

    传送门 蒟蒻我关系式没有找出来. 直接模拟递推过程好了. 代码 #include <cstdio> #define N 21 int a, n, m, x, y; int up[N][2] ...

  10. [luoguP1082] 同余方程(扩展欧几里得)

    传送门 ax≡1(mod b) 这个式子就是 a * x % b == 1 % b 相当于 a * x - b * y == 1 只有当 gcd(a,b) == 1 时才有解,也就是说 ax + by ...