GuGuFishtion

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

Swordsman

读入挂真的吓人,砍掉了$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

最新文章

  1. jquery里面的循环的用法
  2. C语言:内存字节对齐详解[转载]
  3. hdu1242 优先队列+bfs
  4. (C/C++ interview) Static 详解
  5. Ubuntu12.04更新源地址列表
  6. DB天气app冲刺第十一天
  7. WebApi学习总结系列第五篇(消息处理管道)
  8. bzoj2120 2453
  9. Windows Phone 学习笔记(一) 数据存储
  10. AddSelf
  11. Cache替换算法:LRU与LFU的区别
  12. 常用到的html页面布局和组件: 自己用
  13. 执行Hive出现Error running child : java.lang.OutOfMemoryError: Java heap space错误
  14. border三角形
  15. python基础数据类型—int、bool、字符串的常用方法
  16. gevent实现基于epoll和协程的服务器
  17. 对象奔驰E2000
  18. 20款最好的jQuery文件上传插件
  19. [C#]非阻塞监听键盘输入
  20. Python字符串颜色输出

热门文章

  1. Codeforces Round #464 (Div. 2) C. Convenient For Everybody
  2. 批量导出ppt中内嵌的图片
  3. VMware之无法切换桥接网络
  4. 命令执行sql
  5. python项目中输出指定颜色的日志
  6. Python虚拟机类机制之填充tp_dict(二)
  7. SSRS 报表管理器 http://localhost/Reports HTTP500 内部错误处理过程
  8. 网络安全巧设置 Win2008 R2 防火墙详解(1)
  9. ZOJ 3874 Permutation Graph ——分治 NTT
  10. 三叉神经树 ( neuron )