2018 Multi-University Training Contest 7
dls真厉害,快速求$\sum_{a=1}^n \sum_{b=1}^m gcd(a,b) $的个数,我想的方法是根据上节课dls讲的方法,要容过来容过去,这次不用了。
则$f[d]=(n/d)\times (m/d)$。
而$g[d]=f[d]-\sum_{d|x} g[x]$,从大到小枚举因子就可以了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + ;
typedef long long ll; bool flag[maxn]; //标记数组
ll phi[maxn]; //欧拉函数值
int prime[maxn]; //同时得到素数筛
int cnt = ;
void Get_phi(int n)
{
cnt = ;
memset(flag,true,sizeof(flag));
phi[] = ;
for(int i=;i<=n;i++)
{
if(flag[i]) //素数
{
prime[cnt++] = i;
phi[i] = i-; //素数的欧拉函数值是i-1
}
for(int j=;j<cnt;j++)
{
if(i*prime[j]>n)
{
break;
}
flag[i*prime[j]] = false;//素数的倍数不是素数
if(i%prime[j]==) //i%mod prime = 0,那么phi(i*p) = p*phi(i)
{
phi[i*prime[j]] = prime[j]*phi[i];
break;
}
else phi[i*prime[j]] = (prime[j]-)*phi[i];//i mod prime != 0, 那么 phi(i * prime) == phi(i) * (prime-1)
}
}
}
int inv[maxn];
ll f[maxn];
int main()
{
int T; scanf("%d", &T);
Get_phi(1e6 + );
while(T--)
{
int n, m, mod; scanf("%d %d %d", &n, &m, &mod);
if(n > m) swap(n, m);
inv[] = inv[] = ;
for(int i = ; i <= n; i++)
{
inv[i] = (ll)(mod - mod / i) * inv[mod % i] % (ll)mod;
}
ll ans = ;
for(int i = n; i >= ; i--) ///枚举 d | (a, b)
{
f[i] = (ll)n / i * (m / i);
for(int j = i + i; j <= n; j += i) ///枚举 能够整除d的
{
f[i] = f[i] - f[j];
}
ans = (ans + f[i] * i % mod * inv[phi[i]]) % mod;
//printf("%d %lld phi = %lld %lld\n", i, f[i], phi[i], ans);
}
printf("%lld\n", ans);
}
return ;
}
Code
读入挂真的吓人,砍掉了$2/3$的时间。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + ; inline char nc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}
inline int _read(){
char ch=nc();int sum=;
while(!(ch>=''&&ch<=''))ch=nc();
while(ch>=''&&ch<='')sum=sum*+ch-,ch=nc();
return sum;
}
struct node
{
int a[];
int b[];
};
node cur[maxn];
struct single
{
int val, id;
friend bool operator < (single A, single B)
{
return A.val > B.val;
}
}; priority_queue<single> q[];
int v[];
int main()
{
int T; T = _read();
while(T--)
{
int n, k;
n = _read(), k = _read();
// printf("%d %d\n", n, k);
for(int i = ; i <= k; i++) v[i] = _read();
for(int i = ; i <= k; i++)
{
while(!q[i].empty()) q[i].pop();
}
for(int i = ; i <= n; i++)
{
for(int j = ; j <= k; j++) cur[i].a[j] = _read();
for(int j = ; j <= k; j++) cur[i].b[j] = _read();
q[].push({cur[i].a[], i});
}
int flag = ;
int ans = ;
while()
{
flag = ;
for(int i = ; i <= k; i++)
{
if(q[i].empty()) continue;
single tmp = q[i].top();
if(tmp.val <= v[i])
{
flag = ;
q[i].pop();
if(i == k)
{
ans++;
for(int j = ; j <= k; j++)
{
v[j] += cur[tmp.id].b[j];
}
}
else
{ q[i + ].push({cur[tmp.id].a[i + ], tmp.id});
}
}
}
if(!flag) break;
}
printf("%d\n", ans);
for(int i = ; i <= k; i++)
{
printf("%d%c", v[i], i < k ? ' ' : '\n');
}
}
return ;
}
Code
2018 Multi-University Training Contest 7的更多相关文章
- 2018 Nowcoder Multi-University Training Contest 2
目录 Contest Info Solutions A. run D. monrey G. transform H. travel I. car J. farm Contest Info Practi ...
- 2018 Nowcoder Multi-University Training Contest 1
Practice Link J. Different Integers 题意: 给出\(n\)个数,每次询问\((l_i, r_i)\),表示\(a_1, \cdots, a_i, a_j, \cdo ...
- 2018 Nowcoder Multi-University Training Contest 5
Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...
- 2018 Nowcoder Multi-University Training Contest 10
Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...
- HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...
- 2018 Multi-University Training Contest 2
题目链接:2018 Multi-University Training Contest 2 6318 Swaps and Inversions 题意:sum=x*逆序个数+交换次数*y,使sum最小 ...
- 2018 Multi-University Training Contest 1
比赛链接:2018 Multi-University Training Contest 1 6301 Distinct Values 题意:输出一个长度为n的序列,要求满足m个区间的数都不相同,并且字 ...
- hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)
Distinct Values Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 2018 Multi-University Training Contest 4 Problem J. Let Sudoku Rotate 【DFS+剪枝+矩阵旋转】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6341 Problem J. Let Sudoku Rotate Time Limit: 2000/100 ...
- 2018 Multi-University Training Contest 4 Problem K. Expression in Memories 【模拟】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6342 Problem K. Expression in Memories Time Limit: 200 ...
随机推荐
- Linux系统自启动脚
只需编辑/etc/init.d/rc.local文件,在最后加上你的脚本即可. 比如:我已经编写了一个脚本shell.sh,存放在/home/mars704/Desktop/ 下面在终端输入 gedi ...
- Hyper-V 网络虚拟化技术细节
Hyper-V 网络虚拟化技术细节 适用对象:Windows Server 2012 R2 服务器虚拟化能让多个服务器实例在同一台物理主机上同步运行,但各个服务器实例都是相互独立的. 每台虚拟机的运作 ...
- 如何在Linux下使用Rsync
如何在Linux下使用Rsync 吐槽 昨天对scp进行总结之后看到最后有说到Rsync,俗语有云:好奇心害死猫.抱着学习的态度将Rsync给找了出来,然后进行了一些简单的学习.下面介绍一些个常用的命 ...
- MongoDB快速入门学习笔记2 MongoDB的概念及简单操作
1.以下列举普通的关系型数据库和MongoDB数据库简单概念上的区别: 关系型数据库 MongoDB数据库 说明 database database 数据库 table collection 数据库表 ...
- phpMyAdmin 4.7.x CSRF
phpMyAdmin 4.7.x CSRF 场景:管理员登陆phpmyadmin之后,我试验了一下,发现只要是登陆session没有失效应该是都可以的, 利用,phpmyadmin可以通过get方式操 ...
- C++指针详解 (转)
C++指针详解 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区, ...
- 数据结构算法——链表的各种操作,C++和Python
时隔已久,一直没更新博客,感觉很愧疚呀. 先贴上所有的代码.这个是用C++写的 #include "stdafx.h" //Author:Albert //Date: 2018.1 ...
- Spring整合hibernate -SessionFactory
本文目录 1 本文采用 hibernate4 整合 Spring3.1 2 把Spring获取datasource通过class="org.springframework.orm.hibe ...
- Solr配置Ikanalyzer分词器
上一篇文章讲解在win系统中如何安装solr并创建一个名为test_core的Core,接下为text_core配置Ikanalyzer 分词器 1.打开text_core的instanceDir目录 ...
- oracle组合分区
由于Interval分区是针对range的,11g-12.1版本,目前只有Interval—*一共3种Interval的复合分区 range-list方法: partition by range (u ...