• Day2讲课习题题解


    [NOIP2003 普及组] 麦森数 - 洛谷

    P1045 [NOIP2003 普及组] 麦森数

    思路:没啥好新意,直接高精度乘法(后500位可以暴力求),但是考虑到时间复杂度的问题,得用快速幂优化

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int N=1010;
    7. int p;
    8. int f[N],res[N],sav[N];
    9. void mul(int a[],int b[],int c[]){
    10. memset(sav,0,sizeof sav);
    11. for(int i=1;i<=500;i++)
    12. for(int j=1;j<=500;j++)
    13. sav[i+j-1]+=a[i]*b[j];
    14. for(int i=1;i<=500;i++){
    15. sav[i+1]+=sav[i]/10;
    16. sav[i]%=10;
    17. }
    18. memcpy(c,sav,sizeof sav);
    19. }
    20. int main()
    21. {
    22. cin>>p;
    23. cout<<(int)(log10(2)*p+1)<
    24. f[1]=2;
    25. res[1]=1;
    26. while(p){
    27. if(p&1) mul(res,f,res);
    28. p>>=1;
    29. mul(f,f,f);
    30. }
    31. res[1]-=1;
    32. for(int i=500;i>=1;i--){
    33. if(i!=500&&i%50==0) puts("");
    34. cout<
    35. }
    36. return 0;
    37. }

     

    P1850 [NOIP2016 提高组] 换教室

    [NOIP2016 提高组] 换教室 - 洛谷

    思路:一个期望dp

    除法的话(取模and 答案 是 分数情况下,可以利用快速幂+费马小定理)

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N=2e3+10;
    6. const double INF=1e17;
    7. int n,m,v,e;
    8. int c[N][2],g[N][N];
    9. double k[N],f[N][N][2];
    10. int main()
    11. {
    12. memset(g,0x3f,sizeof g);
    13. cin>>n>>m>>v>>e;
    14. for(int i=1;i<=n;i++) cin>>c[i][0];
    15. for(int i=1;i<=n;i++) cin>>c[i][1];
    16. for(int i=1;i<=n;i++) cin>>k[i];
    17. for(int i=1;i<=e;i++){
    18. int a,b,x;
    19. cin>>a>>b>>x;
    20. g[a][b]=g[b][a]=min(x,g[a][b]);
    21. }
    22. for(int k=1;k<=v;k++)
    23. for(int i=1;i<=v;i++)
    24. for(int j=1;j<=v;j++) g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
    25. for(int i=1;i<=v;i++) g[i][i]=g[i][0]=g[0][i]=0;
    26. for (int i=0; i <= 2000; i++)
    27. for (int j = 0; j <= 2000; j++)f[i][j][0] = f[i][j][1] = INF;
    28. f[1][0][0] = f[1][1][1] = 0;
    29. for(int i=2;i<=n;i++){
    30. f[i][0][0]=f[i-1][0][0]+g[c[i-1][0]][c[i][0]];
    31. for(int j=1;j<=min(i,m);j++){
    32. int c1=c[i-1][0],c2=c[i-1][1],c3=c[i][0],c4=c[i][1];
    33. f[i][j][0]=min(f[i][j][0],min(f[i-1][j][0]+g[c1][c3],f[i-1][j][1]+g[c2][c3]*k[i-1]+g[c1][c3]*(1-k[i-1])));
    34. f[i][j][1]=min(f[i][j][1],min(f[i-1][j-1][0]+g[c1][c3]*(1-k[i])+g[c1][c4]*k[i],f[i-1][j-1][1]+g[c1][c3]*(1-k[i-1])*(1-k[i])+g[c1][c4]*(1-k[i-1])*k[i]+g[c2][c3]*k[i-1]*(1-k[i])+g[c2][c4]*k[i-1]*k[i]));
    35. }
    36. }
    37. double ans=INF;
    38. for(int i=0;i<=m;i++){
    39. ans=min(ans,min(f[n][i][0],f[n][i][1]));
    40. }
    41. printf("%.2lf",ans);
    42. return 0;
    43. }

     P4071 [SDOI2016]排列计数

     [SDOI2016]排列计数 - 洛谷

    思路:取模嘛,直接快速幂+费马小定理

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N=1e6+10,mod=1e9+7;
    6. typedef long long ll;
    7. int t;
    8. int n,m;
    9. ll f[N],inv[N],d[N];
    10. ll qmi(ll a,ll b){
    11. ll res=1;
    12. while(b){
    13. if(b&1) res=(ll)(res*a)%mod;
    14. a=(ll)a*a%mod;
    15. b>>=1;
    16. }
    17. return res;
    18. }
    19. void init(){
    20. f[0]=1;
    21. for(int i=1;i<=1e6;i++){
    22. f[i]=i*f[i-1]%mod;
    23. inv[i]=qmi(f[i],mod-2)%mod;
    24. }
    25. d[1]=0,d[2]=1,d[3]=2;
    26. for(int i=4;i<=1e6;i++) d[i]=(i-1)*(d[i-1]+d[i-2])%mod;
    27. }
    28. int main()
    29. {
    30. init();
    31. cin>>t;
    32. while(t--){
    33. cin>>n>>m;
    34. if(n-m==1) cout<<0;
    35. else if(n==m) cout<<1;
    36. else if(m==0) cout<
    37. else{
    38. cout<
    39. }
    40. puts("");
    41. }
    42. return 0;
    43. }

    P1966 [NOIP2013 提高组] 火柴排队 

     [NOIP2013 提高组] 火柴排队 - 洛谷

    思路:有式子对吧,我们首先把式子化简,平方和公式一套即可得出一个贪心经典问题

    然后有一个结论就是:交换相邻两个数,只会让序列逆序对个数+1/-1,直到逆序对减到0的时候,整个过程直接over!

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N=1e5+10,mod=1e8-3;
    6. typedef long long ll;
    7. ll ans=0;
    8. int n;
    9. struct Node{
    10. int x,id;
    11. bool operator <(const Node &t) const {
    12. return x
    13. }
    14. }a[N],b[N];
    15. int q[N],tmp[N];
    16. void merge(int l,int r){
    17. if(l>=r) return ;
    18. int mid=l+r>>1;
    19. merge(l,mid),merge(mid+1,r);
    20. int i=l,j=mid+1,k=0;
    21. while(i<=mid&&j<=r){
    22. if(q[i]>q[j]){
    23. ans=(ans+mid-i+1)%mod;
    24. tmp[k++]=q[j++];
    25. }else tmp[k++]=q[i++];
    26. }
    27. while(i<=mid) tmp[k++]=q[i++];
    28. while(j<=r) tmp[k++]=q[j++];
    29. for(int i=l,j=0;j
    30. }
    31. int main()
    32. {
    33. cin>>n;
    34. for(int i=1;i<=n;i++) cin>>a[i].x,a[i].id=i;
    35. for(int i=1;i<=n;i++) cin>>b[i].x,b[i].id=i;
    36. sort(a+1,a+n+1);
    37. sort(b+1,b+n+1);
    38. for(int i=1;i<=n;i++) q[a[i].id]=b[i].id;
    39. merge(1,n);
    40. cout<
    41. return 0;
    42. }

     

  • 相关阅读:
    Oracle11用户连接默认180天过期
    有向无权图的最短路径
    国庆假期作业day2
    无人机飞控系统硬件设计
    前端工程化精讲第十七课 部署初探:为什么一般不在开发环境下部署代码?
    嵌入式以太网硬件构成与MAC、PHY芯片功能介绍
    bugku web篇(二)
    【归因】MATLAB实现最佳指纹法
    如何分析粉丝兴趣?
    前端设计模式之【访问者模式】
  • 原文地址:https://blog.csdn.net/Demilly123/article/details/127929601