2018.09.09 DL24 Day2总结
今天挂的有点惨……
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总结的更多相关文章
- Trusted Block Chain Summit(2018.10.09)
时间:2018.10.09地点:北京金隅喜来登大酒店
- 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][ ...
- 2018.09.08 DL24 Day1 总结
补一下之前的总结…… T1.restaurant 这道题还是很简单的嘛,子恒dalao非常良心.我们把招牌菜和所需要的菜品绑定在一起就成了完全背包,然后直接跑一遍完全背包即可. #include< ...
- 1.用代码演示String类中的以下方法的用法 (2018.08.09作业)
public class Test_001 { public static void main(String[] args) { String a = "德玛西亚!"; Strin ...
- 【2018.05.09 Python学习及实践】个人项目中使用的Python库备忘-持续更新
科研中无论是使用C/C++.Python.Matlab,如果能找到合适的库可谓是事半功倍: 有时候忙活半天才发现本身就有成熟的库可用,自己实现的在功能.性能.安全性上都远远不及,虽然锻炼了能力,但存在 ...
- 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)
传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ...
- 2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)
传送门 先把边双连通分量用圆方树一样的方法缩点,然后把新建的树树剖维护. 注意对于边双连通分量需要维护动态最小值,可以用multisetmultisetmultiset. 代码: #include&l ...
- 2018.11.09 bzoj4773: 负环(倍增+floyd)
传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ...
- 2018.11.09 bzoj2165: 大楼(倍增+floyd)
传送门 先倍增出iii使得2i2^i2i时间时刚好有每个点能够到mmm层及以上. 然后就可以用floyd+floyd+floyd+倍增求出刚好不超过mmm层的时间,最后再补一层就行了. 代码: #pr ...
随机推荐
- impdp导入
//导入命令impdp 用户/密码@数据库链接 directory=数据库中映射路径 schemas=原用户 remap_schema=原用户:现用户 remap_tablespace=原表空间:现表 ...
- ruby rspec安装
在rubymine里新建Rails application
- Spring Boot 2(一):【重磅】Spring Boot 2.0权威发布
就在今天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...
- 对于BFC(block format context)理解
目录 前言 Box: CSS布局的基本单位&盒模型 什么是BFC?(Block formatting contexts) 元素与盒 正常流 块级与行内级 产生垂直外边距合并的必备条件 前言 什 ...
- matplotlib多种绘图方式
目录 散点图 条形图 直方图 总结 散点图 假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规律? a = [1 ...
- CodeForcesGym 100212E Long Dominoes
Long Dominoes Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on CodeForcesGym. ...
- 防火墙内设置FileZilla Server注意事项
开启了Windows下的防火墙,如何设置FileZilla Server 相关选项,能在服务器端只开启21,23端口就可以正常连接使用 方法/步骤 1. 开启windows防火墙,同时 ...
- 開啟活動監視器 (SQL Server Management Studio)
本主題描述如何開啟 [活動監視器] 來取得有關 SQL Server 處理序以及這些處理序如何影響目前 SQL Server 執行個體的資訊. 此外,本主題也描述如何設定 [活動監視器] 的重新整理間 ...
- CentOS 6.4 下用ntfs-3g挂载Windows NTFS分区
默认情况下,CentOS 6.4不支持Widows NTFS硬盘分区读写,要想把NTFS格式的磁盘挂载到CentOS 6.4下面 需要安装第三方的插件ntfs-3g,这里我们采用编译安装插件. 1.安 ...
- 【Codevs1237&网络流24题餐巾计划】(费用流)
题意:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同. 假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分: 或者把旧餐巾送到快洗部,洗一块需 ...