2017.10.8离线赛总结
来源:互联网 发布:淘宝情趣用品好做吗 编辑:程序博客网 时间:2024/06/05 02:25
第1题:
perica ##——1794
思路:裸裸的组合公式送分题,然而又是这个mod——wa了。错的原因也很明显,不能先对余再除,而且上次讲过的公式也忘了…但今天的重点不是这,而是逆元!
逆元:简单来说,就是将除法变乘法,减法变加法。如-x=+(-x),1/x=1*x^(-1)。 这里就是要用到有关这个的费马小定理——a^(p-2)=a(mod p)。
#include<bits/stdc++.h>#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)#define LL long long#define N 100005#define M 55using namespace std;const int P=1e9+7;int n,k;int A[N];LL dp[N][M];LL ans;struct P1{ void solve(){ REP(i,0,n)dp[i][0]=1; REP(i,1,n) REP(j,1,k) dp[i][j]=(dp[i-1][j]+dp[i-1][j-1])%P; REP(i,k,n)ans+=1LL*A[i]*dp[i-1][k-1],ans%=P; cout<<ans<<endl; }}p1;struct P2{ int Pow(int x,int y) { int res=1; while(y) { if(y&1) res=(1LL*res*x)%P; x=(1LL*x*x)%P; y>>=1; } return res; } void work(int a,int b){ if(a==b){dp[a][b]=1;return;} int res=Pow(a-b,P-2); dp[a][b]=(1LL*dp[a-1][b]*a)%P; dp[a][b]=(1LL*dp[a][b]*res)%P; } void solve(){ REP(i,k,n){ work(i-1,k-1); ans+=1LL*dp[i-1][k-1]*A[i],ans%=P; } cout<<ans<<endl; }}p2;int main(){ srand(time(NULL)); scanf("%d%d",&n,&k); REP(i,1,n)scanf("%d",&A[i]); sort(A+1,A+1+n); int f=rand()%2; if(f)p1.solve(); else p2.solve(); return 0;}
第2题:
delete_num ##——2988
思路:又是求方案的玩意,这一题显然是dp,但是这个序列的元素过int,所以不能单纯的存一维,所以马上就想到状压dp。(其实此题也是可以滚动,也很明显,只存在两层之间的关系)。
#include<bits/stdc++.h>#define REP(i,a,b) for(int i=(a),i_##END_=(b);i<=i_##END_;++i)#define DREP(i,a,b) for(int i=(a),i_##BEGIN_=(b);i>=i_##BEGIN_;--i)#define N 105#define M 100005#define LL long long #define INF 0x3f3f3f3f#define P 1000000007using namespace std;LL A;int n;int len[N],B[M>>1];int dp[N][M];LL num[N],Num[N][M];LL ans;LL Change(LL x,int y) { int L[15],mark[15]; memset(mark,0,sizeof(mark)); int c=0; while(x)L[++c]=x%10,x/=10; int i=1,a=1; while(i<=y){ if(y&i)mark[a]=1; i<<=1; a++; } LL tmp=0; DREP(i,c,1){ if(mark[i])continue; tmp=1LL*(tmp*10+L[i]); } return tmp;}void solve(){ REP(i,1,n+1)REP(j,0,(1<<len[i])-2)Num[i][j]=Change(num[i],j); REP(i,1,n+1)sort(Num[i],Num[i]+(1<<len[i])-1); REP(i,0,(1<<len[1])-2)dp[1][i]=1; int a=0; memset(B,0,sizeof(B)); REP(i,0,(1<<len[1])-2){ while(Num[1][i]>Num[2][a]&&a<=(1<<len[2])-1)a++; if(a==(1<<len[2])-1)break; B[a]+=dp[1][i]; } REP(i,0,(1<<len[2])-2)if(i>0)B[i]+=B[i-1],B[i]%=P; REP(i,2,n+1){ REP(j,0,(1<<len[i])-2)dp[i][j]+=B[j],dp[i][j]%=P; int b=0; if(i<n+1){ memset(B,0,sizeof(B)); REP(j,0,(1<<len[i])-2){ while(Num[i][j]>Num[i+1][b]&&b<=(1<<len[i+1])-1)b++; if(b==(1<<len[i+1])-1)break; B[b]+=dp[i][j],B[b]%=P; } REP(j,0,(1<<len[i+1])-2)if(j>0)B[j]+=B[j-1],B[j]%=P; } } REP(i,0,(1<<len[n+1])-2)ans+=dp[n+1][i],ans%=P; cout<<ans<<endl;}int main() { cin>>A>>n; REP(i,1,n+1){ num[i]=A+i-1; LL k=num[i]; while(k)len[i]++,k/=10; } solve(); return 0;}
第3题:
four ##——2989
思路:枚举中间两个点,再从两点找Mx,其实考试是有想到,但自己的bellman写复杂了,当场否定了这个想法…(同时,今天给小c gay了,bellman其实是卡过去的,它的复杂度是不好证明的(然而我并不造…),遇到链的话就会退化了…)
#include<bits/stdc++.h>#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)#define DREP(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)#define N 2005#define M 5005#define INF 0x3f3f3f3f#define LL long long // LL mod 内存 调试 文件名 using namespace std;int n,m,ans;void chkmax(int &x,int y){if(x<y)x=y;}struct node{ int from,to,cost;}E[M];struct Node{ int Mx[2],cnt[2],Id[2];}A[N];int dis[N][N];void Bellman(int s){ dis[s][s]=0; while(1){ bool f=0; REP(i,1,m) if(dis[s][E[i].from]!=INF && dis[s][E[i].to]>dis[s][E[i].from]+E[i].cost)dis[s][E[i].to]=dis[s][E[i].from]+E[i].cost,f=1; if(!f)break; }}int main(){ scanf("%d%d",&n,&m); REP(i,1,m)scanf("%d%d",&E[i].from,&E[i].to),E[i].cost=1; memset(dis,INF,sizeof(dis)); REP(i,1,n)Bellman(i); REP(i,1,n){ REP(j,1,n){ if(i==j || dis[i][j]==INF)continue; if(dis[i][j]>A[i].Mx[0])A[i].Id[0]=j,A[i].cnt[0]=1,A[i].Mx[0]=dis[i][j]; else if(dis[i][j]==A[i].Mx[0])A[i].cnt[0]++; if(dis[i][j]>A[j].Mx[1])A[j].Id[1]=i,A[j].cnt[1]=1,A[j].Mx[1]=dis[i][j]; else if(dis[i][j]==A[j].Mx[1])A[j].cnt[1]++; } } REP(i,1,n)REP(j,1,n){ if(dis[i][j]==INF || i==j || !A[i].cnt[1] || !A[j].cnt[0] || (A[i].Id[0]==A[j].Id[1] && A[i].cnt[0]==1 && A[j].cnt[1]==1))continue; chkmax(ans,A[i].Mx[1]+dis[i][j]+A[j].Mx[0]); } cout<<ans<<endl; return 0;}
小结 ##:
这次考得不好,还是由于第1题wa了,虽然也是出错在mod,但其实公式跟mod半毛钱关系都没有,而且公式还是讲过的…
阅读全文
0 0
- 2017.10.8离线赛总结
- 2017.10.3离线赛总结
- 2017.10.4离线赛总结
- 2017.10.6离线赛总结
- 2017.10.7离线赛总结
- 2017.10.9离线赛总结
- 2017.10.10离线赛总结
- 2017.10.11离线赛总结
- 2017.10.15离线赛总结
- 2017.10.16离线赛总结
- 2017.10.17离线赛总结
- 2017.10.18离线赛总结
- 2017.10.19离线赛总结
- 2017.10.21离线赛总结
- 2017.10.24离线赛总结
- 2017.10.26离线赛总结
- 2017.10.27离线赛总结
- 2017.10.29离线赛总结
- python面试题收集
- 间接寻址储存的线性表—基本操作实现
- SDUT 3377 数据结构实验之查找五:平方之哈希表(平方探测处理冲突)
- Sqrt(x):求方差
- 关于PHP的WAMPSERVER的配置。
- 2017.10.8离线赛总结
- linux必学的常用操作指令
- 进程相关命令
- angular4----组件间通信
- C语言 十进制转任意进制N(除N取余,逆序排列) 使用递归
- HttpURLConnection和HttpClient使用
- IntelliJ IDEA 2016.2 配置Tomcat 运行Web项目
- 实验二 总结线性表的几种主要存储方式
- 【实战】4-12 Mybatis三剑客之Mybatis-pagehelper