BZOJ3434 [Wc2014]时空穿梭

摔电脑摔电脑!JZP业界毒瘤!

400题纪念~哇终于上400了的说!!!好不容易欸!

题解什么的还是Orz iwtwiioi

我求组合数的方法明明是O(n)的,为什么这么慢!!!令人报警!

喂,话说这题的重点不在求组合数上面吧。。。

 

  1 /**************************************************************
  2     Problem: 3434
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:6888 ms
  7     Memory:140824 kb
  8 ****************************************************************/
  9  
 10 #include <cstdio>
 11 #include <cstring>
 12 #include <algorithm>
 13  
 14 using namespace std;
 15 const int N = 100005;
 16 const int mod = 10007;
 17 const int Tt = 1005;
 18  
 19 int g[21][N], f[21][15][N];
 20 int a[15], p[N], cnt, u[N], mx, mn;
 21 int n[Tt], c[Tt], m[Tt][15];
 22 int C[N][20];
 23 int ans;
 24 bool vis[N];
 25  
 26 inline int read() {
 27   int x = 0, sgn = 1;
 28   char ch = getchar();
 29   while (ch < '0' || '9' < ch) {
 30     if (ch == '-') sgn = -1;
 31     ch = getchar();
 32   }
 33   while ('0' <= ch && ch <= '9') {
 34     x = x * 10 + ch - '0';
 35     ch = getchar();
 36   }
 37   return sgn * x;
 38 }
 39  
 40 int pow(int x, int y) {
 41   int res = 1;
 42   while (y) {
 43     if (y & 1) (res *= x) %= mod;
 44     (x *= x) %= mod;
 45     y >>= 1;
 46   }
 47   return res;
 48 }
 49  
 50 void get_f(int N) {
 51   int i, j, k, l;
 52   for (u[1] = 1, i = 2; i <= N; ++i) {
 53     if (!vis[i])
 54       p[++cnt] = i, u[i] = -1;
 55     for (j = 1; j <= cnt; ++j) {
 56       if ((k = i * p[j]) > N) break;
 57       vis[k] = 1;
 58       if (i % p[j] == 0) {
 59     u[k] = 0;
 60     break;
 61       }
 62       u[k] = -u[i];
 63     }
 64   }
 65   for (C[0][0] = i = 1; i <= N; ++i)
 66     for (C[i][0] = j = 1; j < 19; ++j)
 67       C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
 68    
 69   for (l = 2; l <= 20; ++l)
 70     for (i = 1; i <= N; ++i)
 71       for (j = i, k = 1; j <= N; j += i, ++k)
 72     (g[l][j] += C[i - 1][l - 2] * u[k]) %= mod;
 73   for (i = 1; i <= N; ++i)
 74     for (l = 2; l <= 20; ++l) {
 75       k = 1;
 76       for (j = 1; j <= 12; ++j) {
 77     f[l][j][i] = (f[l][j][i - 1] + k * g[l][i]) % mod;
 78     (k *= i) %= mod;
 79       }
 80     }
 81 }
 82  
 83 void calc(int i, int x) {
 84   memset(a, 0, sizeof(a));
 85   a[1] = 1;
 86   int d1, d2, t, j, k;
 87   for (k = 1; k <= n[i]; ++k) {
 88     t = m[i][k] / x;
 89     d1 = (1ll * t * m[i][k]) % mod;
 90     d2 = (1ll * t * (t + 1) >> 1) % mod;
 91     for (j = n[i] + 1; j > 1; --j)
 92       a[j] =(a[j] * d1 - a[j - 1] * d2) % mod;
 93     (a[1] *= d1) %= mod;
 94   }
 95 }
 96  
 97 int main() {
 98   int i, j, k, l, T;
 99   T = read();
100   for (i = 1; i <= T; ++i) {
101     n[i] = read(), c[i] = read();
102     for (j = 1; j <= n[i]; ++j)
103       m[i][j] = read(), mx = max(mx, m[i][j]);
104   }
105   get_f(mx);
106  
107   for (i = 1; i <= T; ++i) {
108     ans = 0;
109     for (mn = m[i][1], j = 2; j <= n[i]; ++j)
110       mn = min(mn, m[i][j]);
111     for (j = 1; j <= mn; j = k + 1) {
112       k = mn + 1;
113       for (l = 1; l <= n[i]; ++l)
114     k = min(k, m[i][l] / (m[i][l] / j));
115       calc(i, j);
116       for (l = 1; l <= n[i] + 1; ++l)
117     (ans += a[l] * (f[c[i]][l][k] - f[c[i]][l][j - 1])) %= mod;
118     }
119     ans %= mod;
120     printf("%d\n", (ans += mod) %= mod);
121   }
122   return 0;
123 }
View Code(递推求组合数)

 

  1 /**************************************************************
  2     Problem: 3434
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:9596 ms
  7     Memory:134184 kb
  8 ****************************************************************/
  9  
 10 #include <cstdio>
 11 #include <cstring>
 12 #include <algorithm>
 13   
 14 using namespace std;
 15 const int N = 100005;
 16 const int mod = 10007;
 17 const int Tt = 1005;
 18   
 19 int g[21][N], f[21][15][N];
 20 int a[15], p[N], cnt, u[N], mx, mn;
 21 int n[Tt], c[Tt], m[Tt][15];
 22 int fac[N], faci[N], sum[N];
 23 int ans;
 24 bool vis[N];
 25   
 26 inline int read() {
 27   int x = 0, sgn = 1;
 28   char ch = getchar();
 29   while (ch < '0' || '9' < ch) {
 30     if (ch == '-') sgn = -1;
 31     ch = getchar();
 32   }
 33   while ('0' <= ch && ch <= '9') {
 34     x = x * 10 + ch - '0';
 35     ch = getchar();
 36   }
 37   return sgn * x;
 38 }
 39   
 40 int pow(int x, int y) {
 41   int res = 1;
 42   while (y) {
 43     if (y & 1) (res *= x) %= mod;
 44     (x *= x) %= mod;
 45     y >>= 1;
 46   }
 47   return res;
 48 }
 49   
 50 inline int C(int x, int y) {
 51   if (y == 0) return 1;
 52   if (x < y) return 0;
 53   if (sum[x] != sum[y] + sum[x - y]) return 0;
 54   return fac[x] * faci[y] % mod * faci[x - y] % mod;
 55 }
 56   
 57 void get_f(int N) {
 58   int i, j, k, l;
 59   for (u[1] = 1, i = 2; i <= N; ++i) {
 60     if (!vis[i])
 61       p[++cnt] = i, u[i] = -1;
 62     for (j = 1; j <= cnt; ++j) {
 63       if ((k = i * p[j]) > N) break;
 64       vis[k] = 1;
 65       if (i % p[j] == 0) {
 66     u[k] = 0;
 67     break;
 68       }
 69       u[k] = -u[i];
 70     }
 71   }
 72   fac[0] = faci[0] = 1;
 73   for (fac[1] = 1, i = 2; i <= N; ++i)
 74     if (i % mod == 0) {
 75       sum[i] = sum[i - 1] + 1;
 76       fac[i] = fac[i - 1] * (i / mod) % mod;
 77     } else {
 78       sum[i] = sum[i - 1];
 79       fac[i] = fac[i - 1] * i % mod;
 80     }
 81   for (faci[N] = pow(fac[N], mod - 2),i = N - 1; i; --i)
 82     if ((i + 1) % mod == 0)
 83       faci[i] = faci[i + 1] * ((i + 1) / mod) % mod;
 84     else faci[i] = faci[i + 1] * (i + 1) % mod;
 85   
 86   for (l = 2; l <= 20; ++l)
 87     for (i = 1; i <= N; ++i)
 88       for (j = i, k = 1; j <= N; j += i, ++k)
 89     (g[l][j] += C(i - 1, l - 2) * u[k]) %= mod;
 90   for (i = 1; i <= N; ++i)
 91     for (l = 2; l <= 20; ++l) {
 92       k = 1;
 93       for (j = 1; j <= 12; ++j) {
 94     f[l][j][i] = (f[l][j][i - 1] + k * g[l][i]) % mod;
 95     (k *= i) %= mod;
 96       }
 97     }
 98 }
 99   
100 void calc(int i, int x) {
101   memset(a, 0, sizeof(a));
102   a[1] = 1;
103   int d1, d2, t, j, k;
104   for (k = 1; k <= n[i]; ++k) {
105     t = m[i][k] / x;
106     d1 = (1ll * t * m[i][k]) % mod;
107     d2 = (1ll * t * (t + 1) >> 1) % mod;
108     for (j = n[i] + 1; j > 1; --j)
109       a[j] =(a[j] * d1 - a[j - 1] * d2) % mod;
110     (a[1] *= d1) %= mod;
111   }
112 }
113   
114 int main() {
115   int i, j, k, l, T;
116   T = read();
117   for (i = 1; i <= T; ++i) {
118     n[i] = read(), c[i] = read();
119     for (j = 1; j <= n[i]; ++j)
120       m[i][j] = read(), mx = max(mx, m[i][j]);
121   }
122   get_f(mx);
123   
124   for (i = 1; i <= T; ++i) {
125     ans = 0;
126     for (mn = m[i][1], j = 2; j <= n[i]; ++j)
127       mn = min(mn, m[i][j]);
128     for (j = 1; j <= mn; j = k + 1) {
129       k = mn + 1;
130       for (l = 1; l <= n[i]; ++l)
131     k = min(k, m[i][l] / (m[i][l] / j));
132       calc(i, j);
133       for (l = 1; l <= n[i] + 1; ++l)
134     (ans += a[l] * (f[c[i]][l][k] - f[c[i]][l][j - 1])) %= mod;
135     }
136     ans %= mod;
137     printf("%d\n", (ans += mod) %= mod);
138   }
139   return 0;
140 }
View Code(奇怪的组合数求法)

(p.s. 关于那种空间较小的求组合数的方法为什么慢了3秒我也是无言以对。。。)

转载于:https://www.cnblogs.com/rausen/p/4294603.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像平滑滤波

卷积与滤波概念 离散卷积 丢两个骰子&#xff0c;求点数加起来为 ttt 的概率是多少&#xff1f; 两个骰子加起来为4的概率&#xff1a; f(1)g(3)f(2)g(2)f(3)g(1)f(1)g(3) f(2)g(2) f(3)g(1)f(1)g(3)f(2)g(2)f(3)g(1) 写成卷积标准形式为&#xff1a; (f∗g)(4)∑i13f(i)g(…

fast-json.jar的用法

fast-json.jar 解析json数据&#xff1a;一种json数据解析方式是这种&#xff0c;点击这里下载jsonfast.jarfastjsonAPI文档 [{"id": 6378,"title": "test","img": "http://image.jxvdy.com/2014/0929/5428d91c9e6dc8f78fd99_0.p…

从全球制造业的迁移史,看中国制造业未来会怎么走?

来源&#xff1a;挖数&#xff08;ID&#xff1a;washu66&#xff09;摘要&#xff1a;中国制造后续如何发展&#xff1f;翻开全球制造业的迁移史&#xff0c;看是否能从中看出一点端倪。1/ 全球制造业的迁移史1/ 第一次大迁移第一次制造业大迁移发生在20世纪初&#xff0c;由美…

应用|5G时代10大应用场景!

来源&#xff1a;数字化企业摘要&#xff1a;5G商用日益临近&#xff0c;大家可曾想过5G技术未来有哪些具体的应用场景呢&#xff1f;作为5G领跑者的华为公司&#xff0c;早在2年前就出了一份白皮书&#xff0c;这份报告探讨了最能体现5G能力的十大应用场景。简要列表如下1.云V…

标准控件(二)——Calendar

Calendar 日程控件 属性 Borderstyle 边框样式 DayNameFormat 日标头的文本格式 FirstDayOfWeek NextPrevFormat 月导航按钮的格式 方法 DayRender() 在呈现日时激发 protected void Calendar1_DayRender(object sender,…

央行发布论文:区块链能做什么,不能做什么?

来源&#xff1a;悟空智能科央行发布工作论文《区块链能做什么、不能做什么&#xff1f;》&#xff0c;论文称&#xff0c;不要夸大或迷信区块链的功能。区块链应用要立足实际情况。目前区块链投融资领域泡沫明显。论文从经济学角度研究了区块链的功能。首先&#xff0c;在给出…

证明积分

证明积分&#xff1a;$$\int_{-\pi/2}^{\pi/2} (\sin(x))^n dx \frac{n-1}{n}\int_{-\pi/2}^{\pi/2} (\sin(x))^{n-2} dx$$ 证明&#xff1a; \begin{align}\int_{-\pi/2}^{\pi/2} \sin^nx \, dx& -\sin^{n-1}x \cos x\bigg|_{-\pi/2}^{\pi/2} \int_{-\pi/2}^{\pi/2} \co…

图像变换

图像变换有什么用&#xff1f; 图像变换意义&#xff1a; 图像的特征更为突出原来无法直接观测的特征直接显现出来需要提取图像中的特征&#xff0c;便于后续处理及图像理解 常见图像变换&#xff1a; 几何变换&#xff1a;图像放缩、图像平移、图像旋转、图像镜像、图像翻…

UVa 1225 Digit Counting

题意&#xff1a;给出n,将前n个整数顺次写在一起&#xff0c;统计各个数字出现的次数。 用的最笨的办法--直接统计-- 后来发现网上的题解有先打表来做的 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 us…

人工智能产业发展联盟公布首轮AI芯片基准评测结果,评估工具已开源

来源&#xff1a;量子位3月6日&#xff0c;由国际电信联盟、中国信息通信研究院联合主办&#xff0c;人工智能产业发展联盟&#xff08;AIIA&#xff09;和中兴通讯承办的国际论坛“AI in 5G——引领新时代论坛”在深圳召开。来自全球电信运营商、标准组织、互联网企业、设备厂…

软件工程概论第七章

面向对象分析 分析的概念主要有分析类&#xff0c;和分析活动其中分析类中的主要有实体类&#xff0c;边界类&#xff0c;和控制类。知道了分析类主要类型&#xff0c;怎样识别分析类&#xff0c;边界类通常 一个参与者和一个用例之间的交互或通信关联对应一个边界类。控制类负…

图像分割I

为什么要图像分割&#xff1f; 目标 掌握图像分割的基本概念了解图像分割方法分类 目标&#xff1a;将图像划分为不同区域定义&#xff1a;令集合R代表整个图像区域&#xff0c;对R的图像分割可以看作是将R分成N个满足以下条件的非空子集R1,R2,...,RNR_1,R_2,...,R_NR1​,R2​…

MVC中Model BLL层Model模型互转

MVC中Model BLL层Model模型互转 一. 模型通常可以做2种&#xff1a;充血模型和失血模型&#xff0c;一般做法是模型就是模型&#xff0c;不具备方法来操作&#xff0c;只具有属性&#xff0c;这种叫做失血模型(可能不准确)&#xff1b;具备对模型一定的简单操作方法&#xff0c…

OutputCache祥解

当用户訪问页面时&#xff0c;整个页面将会被server保存在内存中&#xff0c;这样就对页面进行了缓存。当用户再次訪问该页&#xff0c;页面不会再次运行数据操作&#xff0c;页面首先会检查server中是否存在缓存&#xff0c;假设缓存存在&#xff0c;则直接从缓存中获取页面信…

图像分割II

区域增长算法 目标 掌握区域生长法的基本思想掌握图像分裂合并分割的基本思想及步骤 区域生长法分割 大津算法的局限性&#xff1a;噪声比较严重的图片、分割目标颜色渐变的情况&#xff0c;分割效果差。 区域生长&#xff1a;从种子点开始&#xff0c;按照一定准则&#x…

205页PPT,看5G+AI引领的下一个时代!

来源&#xff1a;国泰君安证券、暴点摘要&#xff1a;为大家分享一份国泰君安证券关于“电子行业2019年春季投资策略&#xff0c;5GAI系列研究”报告&#xff0c;详看哪些产业将迎来黄金期。预计5G换机高峰期将出现在2020~2023年&#xff0c;届时手机出货量将恢复增长。同时&am…

【转载】Java中各种修饰符与访问修饰符的说明

转&#xff1a;http://handbook.blog.163.com/blog/static/837295522010889212296/ 类&#xff1a; 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 &#xff08;访问修饰符与修饰符的位置可以互换&#xff09;访问修饰符名称说明备注public可以被所有…

图像表示与描述

图像表示与描述 目标 掌握常见的基于轮廓特征的描述掌握常见的图像区域特征描述 对目标特征的测量是要利用分割结果进一步从图像中获取有用信息&#xff0c;为达到这个目的需要解决两个关键问题&#xff1a; 选用什么特征来描述目标(定性)如何精确测量这些特征(定量) 常见…

RISV-V未来将面临怎样的挑战?

来源&#xff1a;MoneyDJ、半导体行业观察继大陆的RISC-V联盟成立之后&#xff0c;台湾RISC-V联盟也在今年正式成立&#xff0c;这也让RISC-V的议题热度逐渐加温&#xff0c;事实上这也是许多人看好能够足以与ARM竞争的架构&#xff0c;加上目前许多国际大厂陆续采用RISC-V架构…

使用matlab程序,基于标准卡标定感压纸的压力分布

任务说明 使用富士感压纸(压力测试纸)测量压力&#xff0c;感压纸受压时会显现颜色&#xff0c;根据峰值应力呈现不同的颜色深度。感压制提供了标准比色卡&#xff0c;给出不同颜色深度对应的压力值。 要求使用matlab&#xff0c;对照标准比色卡&#xff0c;对实验中使用的比…