T1 随 (rand)

dp+矩阵优化+原根

看着题解懵了一晚上加一上午,最后还是看了DeepinC的博客才把暴力码出来,正解看得一知半解,循环矩阵也不太明白,先留坑吧。暴力里用二维矩阵快速幂会tle成20,跟打特判没啥区别。

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define MOD 1000000007
using namespace std;
ll n,m,mod,a[],down,anns,v[],f[][],base[][],ans[],c[][];
ll quick(ll x,ll p,ll md)
{
ll as=;
while(p){
if(p&) as=as*x%md;
x=x*x%md;
p>>=;
}
return as;
}
ll mul_x()
{
for(int i=;i<mod;i++){
for(int j=;j<mod;j++){
for(int k=;k<mod;k++){
c[i][j]=(c[i][j]+base[i][k]*base[k][j]%MOD)%MOD;
}
}
}
for(int i=;i<mod;i++){
for(int j=;j<mod;j++){
base[i][j]=c[i][j];
c[i][j]=;
}
}
}
ll mul_ans()
{
for(int i=;i<mod;i++){
for(int j=;j<mod;j++){
c[][j]=(c[][j]+ans[i]*base[i][j]%MOD)%MOD;
}
}
for(int i=;i<mod;i++){
ans[i]=c[][i];
c[][i]=;
}
}
void quickpow(ll p)
{
ans[]=;
while(p){
if(p&) mul_ans();
mul_x();
p>>=;
}
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&mod);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
if(mod==){
puts("");
return ;
}
if(n==){
anns=quick(a[],m,mod);
printf("%lld",anns);
return ;
}
down=quick(n,MOD-,MOD);
for(int i=;i<mod;i++){
for(int j=;j<=n;j++){
(base[i][i*a[j]%mod]+=down)%=MOD;
}
}
quickpow(m);
for(int i=;i<mod;i++)
anns=(anns+i*ans[i])%MOD;
printf("%lld\n",anns);
}

暴力50

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define MOD 1000000007
using namespace std;
ll n,m,mod,a[],down,anns,v[],f[][],base[],ans[],c[],qpow[],al[],rt;
ll quick(ll x,ll p,ll md)
{
ll as=;
while(p){
if(p&) as=as*x%md;
x=x*x%md;
p>>=;
}
return as;
}
ll mul_x()
{
for(int i=;i<mod;i++){
for(int j=;j<mod;j++){
c[j]=(c[j]+base[i]*base[(j-i+mod)%mod]%MOD)%MOD;
}
}
for(int i=;i<mod;i++){
base[i]=c[i];
c[i]=;
}
}
ll mul_ans()
{
for(int i=;i<mod;i++){
for(int j=;j<mod;j++){
c[j]=(c[j]+ans[i]*base[(j-i+mod)%mod]%MOD)%MOD;
}
}
for(int i=;i<mod;i++){
ans[i]=c[i];
c[i]=;
}
}
void quickpow(ll p)
{
ans[]=;
while(p){
if(p&) mul_ans();
mul_x();
p>>=;
}
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&mod);
for(int i=;i<=mod;i++) al[i]=-;
for(int i=;i<mod;i++){
ll now=,j;
for(j=;j<=mod-;j++){
if(al[now]==-){
al[now]=j;
qpow[j]=now;
now=now*i%mod;
}
else break;
}
if(j==mod-){
rt=i;
break;
}
else for(int k=;k<mod;k++) al[k]=-;
}
mod--;
down=quick(n,MOD-,MOD);
for(int i=;i<=n;i++) scanf("%lld",&a[i]),a[i]=al[a[i]],(base[a[i]]+=down)%=MOD;
quickpow(m);
for(int i=;i<mod;i++)
anns=(anns+qpow[i]*ans[i])%MOD;
printf("%lld\n",anns);
}

懵逼AC

T2 单(single)树形dp+一堆乱七八糟的式子(主要是我自己推不出来)

问题一:dfs一遍维护出每个节点的儿子的权值和sum[ ](包括自己),同时暴力求解b[1](我们认为1为根),即每个节点的sum[ ]值之和。显然sum[1]=Σa[i]。

然后我们就可以发现b[y]=sum[1]-sum[y]+b[x]-sum[y]=b[x]+sum[1]-sum[y]*2 (y为x的儿子)一遍dfs就可以得到所有节点的b[ ]值,问题得解。

问题二:对于上面的式子进行移项 b[y]-b[x]=sum[1]-sum[y]*2 手玩一下多写几项

                b[yy]-b[y]=sum[1]-sum[yy]*2

                b[yyy]-b[yy]-sum[1]-sum[yyy]*2

根据高考数学中学习数列的经验(什么玩意)我们发现把所有式子求和就可以消掉一些项  b[yyy]-b[x]=(n-1)*sum[1]-sum[y]*2-sum[yy]*2-sum[yyy]*2

现在看起来好像还是没法算,但别忘了b[x]=sum[y]+sum[yy]+sum[yyy],所以把上面那个式子加上2*b[x],右边那一坨就可以消没了。设c[y]=b[y]-b[x],cnt=Σc[i];

所以cnt+2*b[1]=(n-1)*sum[1],(1就是总根)sum[1]得解,再带回上面的式子,sum[i]得解,a[x]=sum[x]-Σsum[y](y为x的儿子)dfs一遍a[ ]就求出来了。

考试的时候不知道想什么呢,dp都没看出来,直接求两点之间距离暴力求解,第二问高斯消元,还消炸了,double和int的转换变成shi,压根没往这块想。

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
struct node
{
ll to,nxt;
}t[];
ll T,n,tot,tpy,nxt[],a[],b[],sum[],Sum,c[],cnt;
bool vis[];
void init()
{
tot=;
memset(nxt,,sizeof(nxt));
}
void add(ll x,ll y)
{
t[++tot].to=y;
t[tot].nxt=nxt[x];
nxt[x]=tot;
}
void dfs(ll x)
{
sum[x]=a[x];
for(ll i=nxt[x];i;i=t[i].nxt){
ll y=t[i].to;
if(vis[y]) continue;
vis[y]=;
dfs(y);
sum[x]+=sum[y];
b[]+=sum[y];//cout<<y<<" "<<sum[y]<<" "<<b[1]<<endl;
}
}
void Dfs(ll x)
{
for(ll i=nxt[x];i;i=t[i].nxt){
ll y=t[i].to;//cout<<y<<endl;
if(vis[y]) continue;
b[y]=b[x]+Sum-*sum[y];
vis[y]=;
Dfs(y);
}
}
void worka()
{
memset(b,,sizeof(b));
memset(sum,,sizeof(sum));
Sum=;
for(ll i=;i<=n;i++) scanf("%lld",&a[i]),Sum+=a[i];
memset(vis,,sizeof(vis));
vis[]=;
dfs();
memset(vis,,sizeof(vis));
vis[]=;
Dfs();
for(ll i=;i<=n;i++)
printf("%lld ",b[i]);
puts("");
}
void DFs(ll x)
{
for(ll i=nxt[x];i;i=t[i].nxt){
ll y=t[i].to;
if(vis[y]) continue;
vis[y]=;
c[y]=b[y]-b[x];
cnt+=c[y];
DFs(y);
}
}
void DFS(ll x)
{
for(ll i=nxt[x];i;i=t[i].nxt){
ll y=t[i].to;
if(vis[y]) continue;
vis[y]=;
a[x]-=a[y];
DFS(y);
}
}
void workb()
{
memset(a,,sizeof(a));cnt=;
for(ll i=;i<=n;i++) scanf("%lld",&b[i]);
memset(vis,,sizeof(vis));
vis[]=;
DFs();
a[]=(cnt+b[]*)/(n-);
for(ll i=;i<=n;i++) a[i]=(a[]-c[i])/;
memset(vis,,sizeof(vis));
vis[]=;
DFS();
for(ll i=;i<=n;i++) printf("%lld ",a[i]);
puts("");
}
int main()
{
scanf("%lld",&T);
while(T--){
init();
scanf("%lld",&n);
ll u,v;
for(ll i=;i<n;i++){
scanf("%lld%lld",&u,&v);
add(u,v);add(v,u);
}
scanf("%lld",&tpy);
if(tpy==) worka();
if(tpy==) workb();
}
}

single

T3 题(problem)模拟7 T2visit原题稍改,很可惜,考场上列的式子样例死活过不去,就打了个暴力dp转移,水了几个点。

tpy==0:ans=C(n,i)*C(i,i/2)*C(n-i,(n-i)/2) 从n步中拿出i步左右走,其中i/2步向有走,剩下n-i步中(n-i)/2步向下走。

tpy==1:卡特兰数

tpy==2:设f[i]为走了i步回到(0,0)的方案数,设上一次走了j步回到(0,0),f[i]=f[i-j]*Cat(j/2-1)*4  /*为啥-1我也不知道,*4是因为这j步可以在4个方向上走*/

tpy==3:tpy1+tpy2 ans=C(n,i)*Cat(i/2)*Cat((n-i)/2)   n步中选出i步左右走,走的情况就是卡特兰数。

考试时间留的太少,居然没看出来是卡特兰数,悲伤。

#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define mod 1000000007
using namespace std;
ll n,tpy,tot,prime[],ans,inv[],fac[],facinv[],f[];
bool mark[];
void init()
{
fac[]=;inv[]=;facinv[]=;
for(int i=;i<=n+;i++){
if(i!=) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
fac[i]=fac[i-]*i%mod;
facinv[i]=facinv[i-]*inv[i]%mod;
}
}
ll C(ll a,ll b)
{
return fac[a]*facinv[b]%mod*facinv[a-b]%mod;
}
void work0()
{
init();ans=;
for(int i=;i<=n;i+=)
ans=(ans+C(n,i)*C(i,i>>)%mod*C(n-i,(n-i)>>)%mod)%mod;
printf("%lld\n",ans);
}
void work1()
{
init();ans=;
ans=C(n,n>>)*inv[(n>>)+]%mod;
printf("%lld\n",ans);
}
void work2()
{
init();f[]=;
for(int i=;i<=n;i+=)
for(int j=;j<=i;j+=)
f[i]=(f[i]+f[i-j]*C(j-,(j>>)-)%mod*inv[j>>]%mod*%mod)%mod;
printf("%lld\n",f[n]);
}
void work3()
{
init();ans=;
for(int i=;i<=n;i+=)
ans=(ans+C(n,i)*C(i,i>>)%mod*inv[(i>>)+]%mod*C(n-i,(n-i)>>)%mod*inv[((n-i)>>)+]%mod)%mod;
printf("%lld\n",ans);
}
int main()
{
scanf("%lld%lld",&n,&tpy);
if(tpy==) work0();
if(tpy==) work1();
if(tpy==) work2();
if(tpy==) work3();
}

problem

%%%liu_runda

7.27 NOIP模拟测试9 随 (rand)+单(single)+题(problem)的更多相关文章

  1. 2019.7.27 NOIP模拟测试9 反思总结

    先来整理题目 T1题目大意:给出n个数字和一个质数作为模数,一个变量x初始值为1.进行m次操作,每次让x随机乘上n个数中的一个,问m次操作以后x的期望值. 答案一定可以用分数表示,输出分子乘分母逆元的 ...

  2. NOIP模拟测试9「随·单·题」

    liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...

  3. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  5. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  6. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  7. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  8. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

  9. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

随机推荐

  1. 表演的艺术,妖尾回合制战斗系统客户端设计[Unity]

    妖尾历经几年开发,终于在今年6月底顺利上线,笔者从2017年初参与开发,主要负责妖尾战斗系统开发.战斗作为游戏的核心玩法系统,涉及很多技术点,希望能借几篇文字,系统性总结MMORPG战斗系统的开发经验 ...

  2. 详解 IaaS、PaaS和SaaS 以及他们各自的代表公司

    ——IaaS,PaaS和SaaS 是云计算领域的专业术语,也是云计算的三种服务模式.   (1)SaaS:Software as a Service,软件即服务(也称为云应用程序服务) . 云市场中企 ...

  3. 海边拾贝-A-算法篇

    收集若干算法博客地址,不定期会更新: 算法 陈浩,leetcode 的C++解法  https://github.com/haoel/leetcode 王亮,很多题目讲解的比较详细   https:/ ...

  4. 移动端js触摸touch详解(附带案例源码)

    移动端触摸滑动原理详解案例,实现过程通过添加DOM标签的触摸事件监听,并计算触摸距离,通过距离坐标计算触摸角度,最后通过触摸角度去判断往哪个方向触摸的. 触摸的事件列表 触摸的4个事件: touchs ...

  5. mysql-5.7.23-winx64 解压版详细安装教程

    1.下载解压版: 2.配置环境变量 (1)新建MYSQL_HOME变量,并配置值为: C:\softwaretool\mysql-5.7.23-winx64 计算机→属性→高级系统设置→高级→环境变量 ...

  6. Docker学习(六)-Kubernetes - Spring Boot 应用

    接上一篇 https://www.cnblogs.com/woxpp/p/11872155.html 新建 k8s-demo.yaml apiVersion: apps/v1beta2 kind: D ...

  7. Kubernetes PV与PVC的关系

    Kubernetes PV与PVC的关系 PersistenVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理,分为有静态与动态.PersistentVolumeClaim ...

  8. Spring源码系列 — Resource抽象

    前言 前面两篇介绍了上下文的启动流程和Environemnt的初始化,这两部分都是属于上下文自身属性的初始化.这篇开始进入Spring如何加载实例化Bean的部分 - 资源抽象与加载. 本文主要从以下 ...

  9. Python TK编程第一部分 Hello Again

    当你想写大一点的程序的时候,将你的代码封装到一个或者多个类里会是一个不错的办法.下面'hello world'这个例子来自Matt Conway的Tkinter Life Preserver. fro ...

  10. vue中nextTick的理解

    A. vue 中的 nextTick 是什么? 1.首先需要清楚,nextTick是一个函数:这个函数的作用,简单理解就是下一次渲染后才执行 nextTick 函数中的操作: 2.在下一次 DOM 更 ...