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 ...
随机推荐
- [Python3网络爬虫开发实战] 1.8.3-Scrapy-Splash的安装
Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具,本节来介绍它的安装方式. Scrapy-Splash的安装分为两部分.一个是Splash服务的安装,具体是通过Dock ...
- 零基础入门学习Python(23)--递归:这帮小兔崽子
知识点 我们都知道兔子繁殖能力是惊人的,如下图: 我们可以用数学函数来定义: 假设我们需要求出经历了20个月后,总共有多少对小兔崽子? 迭代实现 def fab(n): n1 = 1 n2 = 1 n ...
- 指定PING的网卡
struct ifreq ifr; // 绑定在eth0上 memset( &ifr, , sizeof( struct ifreq ) ); snprintf( ifr.ifr_name, ...
- 安装 asp.net core 出错
I received the same error message on a fresh Windows 10 install, with a fresh Visual Studio 2015 ins ...
- Vue如何在data中正常引入图片路径
在Vue项目中通过data设置图片路径,然后在template中引入后页面无法显示图片,浏览器控制台报错: 刚开始以为是路径出问题了,于是绝对路径.相对路 ...
- 原生js获取复选框的值
obj = document.getElementsByName("dk_tj"); var longtxt = ""; for (k in obj) { ...
- python之抽象 2014-4-6
#抽象 8.40am-1.懒惰即美德2.抽象和结构3.创建函数 内建的callable 函数可以判定函数是否可以调用 >>> import math >>> x=1 ...
- 微信开放平台PC端扫码登录功能个人总结
最近公司给我安排一个微信登录的功能,需求是这样的: 1.登录授权 点击二维码图标后,登录界面切换为如下样式(二维码),微信扫描二维码并授权,即可成功登录: 若当前账号未绑定微信账号,扫描后提示“ ...
- iLBC 压缩比
*---------------------------------------------------* * ...
- I/O---BufferedInputStream及相关类介绍
关于BufferedInputStream 是java提供的具有缓存作用的字节输入流.与之对应的还有BufferedOutStream 和 BufferedRead 和BufferedWriter 这 ...