直接推公式没有推出来

看了题解才会做。。

首先能够确定前面几个数的gcd一定是2^j * 3^k, 其中k<=1

那么可以用dp[i][j][k]来表示到第i位的gcd是2^j*3^k

f(j,k) 为 n / 2^j / 3^k

那么状态转移有

dp[i+1][j][k]=dp[i][j][k]*( f(j,k)-i );    //继承前一状态

dp[i+1][j-1][k]=dp[i][j][k]*( f(j-1,k)-f(j,k) );

dp[i+1][j][k-1]=dp[i][j][k]*( f(j,k-1)-f(j,k) );

  1. #include <iostream>
  2. using namespace std;
  3. #define mod 1000000007
  4. int n,dp[][][];
  5. int f(int x,int y)
  6. {
  7. int tmp=(<<x);
  8. if (y)
  9. tmp*=;
  10. return n/tmp;
  11. }
  12. int main()
  13. {
  14. scanf("%d",&n);
  15. int p=;
  16. while ((<<p)<=n)
  17. p++;
  18. p--;
  19. dp[][p][]=;
  20. if ((<<(p-))*<=n)
  21. dp[][p-][]=;
  22.  
  23. for (int i=;i<n;i++)
  24. {
  25. for (int x=;x<=p;x++)
  26. {
  27. for (int y=;y<=;y++)
  28. {
  29. dp[i+][x][y]=(dp[i+][x][y]+1LL*dp[i][x][y]*(f(x,y)-i))%mod;
  30. if (x)
  31. dp[i+][x-][y]=(dp[i+][x-][y]+1LL*dp[i][x][y]*(f(x-,y)-f(x,y)))%mod;
  32. if (y)
  33. dp[i+][x][y-]=(dp[i+][x][y-]+1LL*dp[i][x][y]*(f(x,y-)-f(x,y)))%mod;
  34. }
  35. }
  36. }
  37. printf("%d",dp[n][][]);
  38. }

数论+线性dp——cf1174A的更多相关文章

  1. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  2. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  3. hdu1712 线性dp

    //Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...

  4. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  5. POJ 2479-Maximum sum(线性dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33918   Accepted: 10504 Des ...

  6. poj 1050 To the Max(线性dp)

    题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...

  7. nyoj44 子串和 线性DP

    线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...

  8. 『最大M子段和 线性DP』

    最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...

  9. 『最长等差数列 线性DP』

    最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...

随机推荐

  1. Mybatis_环境搭建

    1.配置pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  2. ie兼容小知识点

    1.ie的滤镜特别针对ie使用css3的使用 (1)从css3渐变:filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=# ...

  3. this.$router.push

    跳转详情页this.$router.push({ path: `/activityDetails/${id}` })

  4. cin,cout优化

    https://www.cnblogs.com/PrayG/p/5749832.html ios_base::sync_with_stdio(0);    cin.tie(0); 涨知识了

  5. .net core 读取appsetting.json

    1.在appsetting.json 文件中添加自定义配置 { "Logging": { "LogLevel": { "Default": ...

  6. Servlet - request对象相关

    request对象中封装了当前请求的所有请求信息, request对象由Tomcat服务器创建, 并作为实参传递给处理请求的Servlet的service()方法 1. 获取请求头数据 // 获取请求 ...

  7. DOM——创建元素的三种方式

    document.write()  document.write('新设置的内容<p>标签也可以生成</p>'); innerHTML  var box = document. ...

  8. 【Codeforces Round #589 (Div. 2) D】Complete Tripartite

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 其实这道题感觉有点狗. 思路大概是这样 先让所有的点都在1集合中. 然后随便选一个点x,访问它的出度y 显然tag[y]=2 因为和他相连了嘛 ...

  9. Java中的线程Thread方法之---interrupt()

    前几篇都介绍了Thread中的几个方法,相信大家都发现一个相似点,那就是sleep,join,wait这样的阻塞方法都必须捕获一个InterruptedException异常,顾名思义就是一个线程中断 ...

  10. 数据结构C++版-队列

    一.概念 分类: 二.补充说明 1.<面向对象的队列设计>课程问答: 首先要明确数据结构和数据存储结构的概念. 数据结构是指数据对象之间的逻辑关系,例如二叉树,队列,栈等,而数据存储结构是 ...