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 ...
随机推荐
- python读取xls文件
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/10/17 14:41 # @Author : Sa.Song # @Desc ...
- python代码notepad++不变色问题。
原来是文档后缀名是.txt造成的,应该改成.py,疏忽了...
- stm32串口——标志位学习
/* 在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送 ...
- 信号量和互斥量C语言示例理解线程同步
Table of Contents 1. 线程同步 1.1. 用信号量进行同步 1.2. 用互斥量进行同步 2. 参考资料 线程同步 了解线程信号量的基础知识,对深入理解python的线程会大有帮助. ...
- 使用chrome开发程序,自动刷新开发目录
npm i livereload -g 在开发目录下: livereload 安装这个插件:https://chrome.google.com/webstore/detail/livereload/j ...
- ActiveMQ初步学习
本文主要参考张丰哲大神的简书文章,链接 https://www.jianshu.com/p/ecdc6eab554c JMS,即Java Message Service,通过面向消息中间件(MOM:M ...
- Windows API 学习记录1
这里面的好多函数不能死记硬背,知道有这个函数就行,等用到了,再回来细看 一.窗口管理函数包括以下几类: 按钮函数(Button) Microsoft提供了对话框和控制来支持应用程序与用户之间的交互通讯 ...
- P3369 【模板】普通平衡树(Splay)
题目链接:https://www.luogu.org/problemnew/show/P3369 修改了一下之前的模板,支持重复数值的存储 #include<bits/stdc++.h> ...
- linux实用命令-待补充
- du 查看目录大小 - du -h 带有单位显示目录信息 - df 查看磁盘大小 - df -h 带有单位显示磁盘信息 - netstat 显示网络状态信息 - 清除僵尸进程 ps -eal | ...
- 获取完整的URL request.getQueryString()
public String codeToString(String str) { String strString = str; try { byte tempB[] = strString.getB ...