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 ...
随机推荐
- [Bzoj2588]Count on a tree(主席树+LCA)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- excel VBA 将文本数值转换为数字格式(单元格中数据左上角是绿三角,鼠标点上有叹号标示)
Range("A6").SelectSelection.CopyRange("A10:A60").SelectRange(Selection, Selectio ...
- 使用 Dom4j 将 XML 转换为 MAP
本文为转载:http://blog.sina.com.cn/s/blog_6145ed810100z164.html 原文地址. 自己仅作备忘录方便查找留了一份. 这是解析Xml 的辅助类 pack ...
- 在 Amazon AWS 搭建及部署网站:(二)安装、配置软件,启动网站
现在,我们已经有了一台EC2主机,具备了基本的硬件环境.下面,开始软件环境的配置. 第一步:连接服务器 后面所有的一切,都需要在SSH终端窗口操作.首先,我们需要一个SSH客户端.PuTTY是很常用的 ...
- python中subprocess.Popen的args和shell参数的使用
subprocess模块定义了一个类: Popen class subprocess.Popen( args, bufsize=0, executable=None, ...
- redhat-2
2016年5月16日-工作日志1 通过PXE安装RHEL7.2系统,部署satellite6.2(采用不是least-stable版本,是Satellite-6.2.0-RHEL-7-20160512 ...
- rpm包管理 命令
rpm -ivh package.rpmrpm -ivh --force package_name.rpm # ...conflict with...rpm -ivh --nodeps packag ...
- DownloadManager的使用
DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类DownloadManager.Query和DownloadManager.Request.DownloadManage ...
- 【转】DontDestroyOnLoad(Unity3D开发之五)
原文 http://blog.csdn.net/cocos2der/article/details/38320773 主题 Unity3D Unity中我们从A场景切换到B场景的时候,A场景所有对象 ...
- Unity属性——AddComponentMenu
字面理解:添加 组件选项菜单 分析:可能是添加一个脚本或者组件到一个物体上 验证: 新建一个脚本:AttributeTest 提示:添加一个组件菜单属性,允许你放一个脚本在Compoent菜单下,来代 ...