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 ...
随机推荐
- A JavaScript Image Gallery
childNodes property: The childNodes property is a way of getting information about the children of ...
- 爬虫工程师常用的 Chrome 插件
做多了爬虫都知道,写一个爬虫大部分时间不是在代码上,而是在分析网页上,所有有一套好用的工具可以极大节省劳动力,这里把平时积累的一些 Chrome 插件分享出来,均来自本人和同事推荐,并不定时更新,欢迎 ...
- java的类加载器体系结构和双亲委派机制
类加载器将字节码文件加载到内存中,同时在方法区中生成对应的java.land.class对象 作为外部访问方法区的入口. 类加载器的层次结构: 引导类加载器<-------------扩展类加 ...
- CMD命令简介
cmd是command的缩写.即命令行 . 虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一般Wind ...
- Creating Hyperv Agent Installer
Creating Hyperv Agent Installer Skip to end of metadata Created by Anshul Gangwar, last modified ...
- Azure Active Directory中的特权身份管理如何运作?
[TechTarget中国原创] 用户权限不是平等的.有些用户需要有大量权利和特权——通常这些都是管理员.企业在允许特权用户进行管理以及支持活动时,还需要意识到特权用户也有可能犯错.他们会犯错.他们可 ...
- 5、CSS基础part-3
1.CSS列表 ①类型 ul.disc {list-style-type: disc} ②位置 ul.inside {list-style-position: inside} ③列表图像 2.表格
- 【Two Sum】cpp
题目: Given an array of integers, find two numbers such that they add up to a specific target number. ...
- Locust性能测试框架学习
1. Locust简介 Locust是使用Python语言编写实现的开源性能测试工具,简洁.轻量.高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力. 官网:https://loc ...
- copy & deepcopy
1 import copy 2 3 字典参照列表结论,看是否有深层嵌套. 4 a = {'name':1,'age':2} 5 b = a 6 a['name'] = 'ff' 7 print(a) ...