T1.随

  看题第一眼,就瞄到最下面 孙金宁教你学数学  ?????原根?目测神题,果断跳过。

  最后打了个快速幂,愉快的收到了达哥送来的10分。

  实际上这题暴力不难想,看到一个非常小的mod应该就能想到复杂度与mod有关,然后dp式子也挺显然的。

  比较神的是最后的优化,我们用 f[i][j]表示经过i次操作,最终%mod后与原根的j次方同余的方案数,然后,之前的转移

  f[i][j*k%mod]=f[i-1][j]*sum[k](sum[k]为k在n个数中出现的次数) 就变成了f[ i ] [ ( j + k ) % ( mod-1 ) ]=f[i-1][j]*sum[k];

  那么这有什么卵用呢,原来的转移矩阵变成了循环矩阵,于是乎就可以mod^2乘一次。

  另外,对于这道题,原根没有必要O(mod1/4)求,mod^2暴力就行。。。

  总复杂度O(mod^2logm).

  数据差评,没有80分算法

 #include<bits/stdc++.h>
#define p 1000000007
using namespace std;
int n,m,mod,a,sum[],yuan,ys[],yx[];
long long b[][],aa[],c[],d[];
bool v[];
inline void cheng()
{
for(int i=;i<mod;i++)
{
d[i]=;
for(int j=;j<mod;j++)
d[i]=(d[i]+aa[j]*b[j][i])%p;
}
for(int i=;i<mod;i++)
aa[i]=d[i];
}
inline void z()
{
for(int i=;i<mod;i++)
{
c[i]=;
for(int j=;j<mod;j++)
c[i]=(c[i]+b[][j]*b[j][i])%p;
}
for(int i=;i<mod;i++)
b[][i]=c[i];
for(int i=;i<mod;i++)
for(int j=;j<mod;j++)
b[i][j]=b[i-][(j==)?mod-:j-];
}
inline long long qpow(long long x,long long y)
{
long long ans=;
while(y)
{
if(y&)ans=ans*x%p;
x=x*x%p;
y>>=;
}
return ans;
}
int main()
{
scanf("%d%d%d",&n,&m,&mod);
for(int i=;i<mod;i++)
{
memset(v,,sizeof(v));
long long k=;
bool kkk=;
for(int j=;j<mod;j++)
{
if(v[(k*i)%mod])
{
kkk=;
break;
}
k=(k*i)%mod,v[k]=true;
}
if(!kkk)
{
yuan=i;
break;
}
}
for(int i=,j=yuan;i<mod;i++,j=j*yuan%mod)
ys[j]=i,yx[i]=j;
for(int i=;i<=n;i++)
scanf("%d",&a),sum[ys[a]]++;
for(int i=;i<mod;i++)
for(int j=;j<mod;j++)
b[i][(i+j-)%(mod-)+]+=sum[j];
aa[mod-]=;
long long bb=qpow(n,m),aaa=;
while(m)
{
if(m&) cheng();
z();
m>>=;
}
for(int i=;i<mod;i++)
(aaa+=yx[i]*aa[i])%=p;
cout<<aaa*qpow(bb,p-)%p;
return ;
}

T2.单

  这也是一道很帅的题,首先对于t=0的操作,令sum为所有节点的权值之和,我们首先进行暴力求出b[1]的值,然后对于其他节点,我们可以进行换根:

  b[x]=b[fa]-siz[x]+(sum-siz[x]);这个式子比较显然。于是30分到手。

  对于t=1的操作,我们把上面那个式子变一下就可以得到2*siz[x]=b[fa]-b[x]+sum。也就是说,我们只要求出sum的值,就可以求出所有的a。

  考试的时候就死在了这里,发现不会求sum,不同与其他人的高斯消元,我采取了一种更为sha diao的做法:枚举sum值,代进去看能不能成立。。。。。由于题中有a[i]<=100的限制,所以sum不会很大,理论上有60分,但是不知道为啥死掉了。

  实际上,有一个隐藏的条件:d[1]=∑siz[i] (2<=i<=n),然后我们将上面那个式子x=2到x=n的情况全都写下来相加,将前面这个式子×2,再将这两部分相减,我们就会惊喜的发现:

  sum=(∑d[fa]-d[x]-d[1]*2)/(n-1);

  于是我们就可以愉快的ac了。

 #include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,fi[],ne[],to[],tot,a[],b[],sum,siz[],de[];
bool o;
inline void add(int x,int y)
{
ne[++tot]=fi[x];
to[tot]=y;
fi[x]=tot;
}
void dfs1(int x,int fa)
{
siz[x]=a[x];b[]+=(de[x]-)*a[x];
for(int i=fi[x];i;i=ne[i])
{
int y=to[i];
if(y!=fa)
{
de[y]=de[x]+;
dfs1(y,x);
siz[x]+=siz[y];
}
}
}
void dfs2(int x,int fa)
{
b[x]=b[fa]-siz[x]+sum-siz[x];
for(int i=fi[x];i;i=ne[i])
{
int y=to[i];
if(y!=fa)
{
dfs2(y,x);
}
}
}
void dfs3(int x,int fa)
{
siz[x]=(b[fa]-b[x]+sum)>>;a[x]=siz[x];
for(int i=fi[x];i;i=ne[i])
{
int y=to[i];
if(y!=fa)
{
dfs3(y,x);
a[x]-=siz[y];
}
}
}
void gsm(int x,int fa)
{
for(int i=fi[x];i;i=ne[i])
{
int y=to[i];
if(y!=fa)
{
sum+=b[x]-b[y];
gsm(y,x);
}
}
}
main()
{
scanf("%lld",&t);
while(t--)
{
tot=sum=;
memset(fi,,sizeof(fi));
memset(b,,sizeof(b));
memset(a,,sizeof(a));
memset(siz,,sizeof(siz));
memset(de,,sizeof(de));
scanf("%lld",&n);
for(int i=,x,y;i<n;i++)
{
scanf("%lld%lld",&x,&y);
add(x,y),add(y,x);
}
cin>>o;
if(o)
{
for(int i=;i<=n;i++)
scanf("%lld",&b[i]);
gsm(,);
sum=(b[]*-sum)/(n-);
siz[]=sum;
for(int i=fi[];i;i=ne[i])
{
dfs3(to[i],);
siz[]-=siz[to[i]];
}
a[]=siz[];
for(int i=;i<=n;i++)
printf("%lld ",a[i]);
puts("");
}
else
{
for(int i=;i<=n;i++)
scanf("%lld",&a[i]),sum+=a[i];
de[]=;
dfs1(,);
for(int i=fi[];i;i=ne[i])
{
int y=to[i];
dfs2(y,);
}
for(int i=;i<=n;i++)
printf("%lld ",b[i]);
puts("");
}
}
return ;
}

T3.题

  送分题,但我没有全部接到。。

  对于opt=0,ans=C(n,n/2)^2;

  对于opt=1,ans=catalan(n);

  对于opt=2,dp即可

  对于opt=3,枚举一个方向走的步数,ans=∑catalan(i)*catalan((n-i-i)/2)*C(n,i+i);

  另外,求大神解释我曾经的visit题解(那两个组合数怎么解释啊)

 #include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int n,k;
long long js[],ni[],f[][][];
inline long long qpow(long long x,long long y)
{
long long ans=;
while(y)
{
if(y&)ans=ans*x%mod;
x=x*x%mod;
y>>=;
}
return ans;
}
inline long long c(long long x,long long y)
{
return js[x]*ni[x-y]%mod*ni[y]%mod;
}
int main()
{
scanf("%d%d",&n,&k);
js[]=ni[]=;
for(int i=;i<=n+n;i++)
js[i]=js[i-]*i%mod,ni[i]=qpow(js[i],mod-);
if(k==)
{
printf("%lld\n",c(n,n/)*c(n,n/)%mod);
return ;
}
if(k==)
{
printf("%lld\n",c(n,n/)*qpow(n/+,mod-)%mod);
return ;
}
if(k==)
{
f[][][]=;
for(int i=;i<=n;i++)
{
f[i&][][]=(f[(i-)&][][]+f[(i-)&][][]+f[(i-)&][][]+f[(i-)&][][])%mod;
for(int j=-n;j<=+n;j++)
if(j!=)
f[i&][][j]=(f[(i-)&][][j-]+f[(i-)&][][j+])%mod;
for(int j=-n;j<=+n;j++)
if(j!=)
f[i&][j][]=(f[(i-)&][j-][]+f[(i-)&][j+][])%mod;
}
cout<<f[n&][][]<<endl;
return ;
}
if(k==)
{
long long ans=;
for(int i=;i<=n/;i++)
ans=(ans+c(n,i+i)*c(i+i,i)%mod*qpow(i+,mod-)%mod*c(n-i-i,(n-i-i)/)%mod*qpow((n-i-i)/+,mod-))%mod;
cout<<ans;
}
return ;
}

noip模拟9 达哥随单题的更多相关文章

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

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

  2. 7.27 NOIP模拟测试9 随 (rand)+单(single)+题(problem)

    T1 随 (rand) dp+矩阵优化+原根 看着题解懵了一晚上加一上午,最后还是看了DeepinC的博客才把暴力码出来,正解看得一知半解,循环矩阵也不太明白,先留坑吧.暴力里用二维矩阵快速幂会tle ...

  3. 17.2.10 NOIP模拟赛 聪哥的工资

    聪哥的工资 (money/money.in/money.out) 时限1000ms 内存256MB 题目描述 lwher: 了体验劳苦大众的生活,聪哥在暑假参加了打零工的活动,这个活动分为n个工作日, ...

  4. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  5. Nescafe #29 NOIP模拟赛

    Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...

  6. HZOJ 20190818 NOIP模拟24题解

    T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...

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

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

  8. 【入门OJ】2003: [Noip模拟题]寻找羔羊

    这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...

  9. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

随机推荐

  1. Kafka 学习笔记之 Producer/Consumer (Scala)

    既然Kafka使用Scala写的,最近也在慢慢学习Scala的语法,虽然还比较生疏,但是还是想尝试下用Scala实现Producer和Consumer,并且用HashPartitioner实现消息根据 ...

  2. poll(2) 源码分析

    poll(2) poll(2) 系统调用的功能和 select(2) 类似:等待一个文件集合中的文件描述符就绪进行I/O操作. 使用 实现 select(2) 的局限性: 关注的文件描述符集合大小最大 ...

  3. eclipse中Tomcat version 9.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5, 6, 7, and 8 Web modules

    eclipse中导入了一个别人的项目,运行时提示没有可以使用的服务器,如下: 查看了下项目属性设置中的服务器,还是提示没有可用服务器: 尝试对部署在已有服务器下的项目Add and Remove... ...

  4. canvas实现平面迁徙图

    前言 最近在做自己维护的一个可视化工具的时候,在添加基于echart的雷达图的时候,按照echart官网案例写完发现在自己项目中无法正常运行,排查了一番发现是我项目中echart的版本太低.找到问题原 ...

  5. Django高级实战 开发企业级问答网站 ✌✌

    Django高级实战 开发企业级问答网站 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 从实际需求分析开始,实现当今主流知识问答应用的功能,包括动态.文章.问 ...

  6. 自力更生Collections.sort发现比较结果混乱?Comparator的锅还是强转类型导致?

    近日开发任务时间充裕一些,于是有时间回顾一下项目. 我关注到了项目中使用的七牛云的对象存储服务. 作为测试需要上传了一些图片,但七牛的控制台却无法将内容按照上传时间排序或者是按照日期查询,由于buck ...

  7. iOS开发请您把握现在 — 面向未来学习

    iOS开发请您把握现在 — 面向未来学习 这一篇文章,如果你是一名iOS开发正好也处于开发晋升瓶颈迷茫期,不妨停下你的脚步,花五分钟看看,兴许有你需要的!文章结尾有彩蛋 群里常见的唱哀 iOS现在到底 ...

  8. 算法---区间K大数查找 Java 蓝桥杯ALGO-1

    import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(Strin ...

  9. 将JSON反序列化为指定的.NET类型

    前言: 关于将JSON格式数据反序列化为指定的.NET类型数据常见的场景就是,关于网络请求获取请求成功的响应数据.本篇主要讲的的是如何通过使用Newtonsoft.Json中的JsonConvert. ...

  10. Bootstrap Studio Mac网页设计神器

    Bootstrap Studio Mac网页设计神器 美丽的组件 Bootstrap Studio附带了大量漂亮的组件,用于构建响应式页面.我们有页眉,页脚,画廊,幻灯片甚至基本元素,如跨度和div. ...