#421 Div1 C

题意

在 (0, n) 和 (m, 0) 处各有一个装置,从起始点(0, 0)出发,首先走短路到 (m, 0) 拿起装置回到起始点,再去 (0, n) 处拿起装置回到起始点。当 (m, 0) 处的装置被触碰后,对于后面所有时刻,如果存在某一时刻有一点 (x, y) 和其余两个装置的位置三点组成的三角形面积为s,则计数加1,求最终计数。

分析

  • 对于状态 1,即从 \((m, 0)\) 移动到 \((0, 0)\) 的过程,设在 x 轴上移动的坐标为 \((k, 0)\) ,设任意点坐标 \((x, y)\) ,则有 \(((0, n) - (k, 0)) \times ((x, y) - (k, 0)) = 2 * s\) ,作向量叉乘运算。有\(|k*y + n*x - n*k| = 2*s\),如果要求 (x, y) 有整数解,则要求 \(gcd(k, n)|2*s (1 \leq k \leq m)\),对 \(n, k, 2*s\) 分解质因子,设质因子的个数分别为 \(ni, ki, si\) ,如果要满足条件,则对于所有质因子有 \(min(ni, ki) \leq si\),如果 \(ni \leq si\),则 \(ki\) 没有限制,如果 \(ni > si\),则 \(ki \leq si\),可以直接考虑 \(ni > si, ki = si + 1\) 的情况,只要是\(p^{si+1}\)的倍数都是不符合条件,而剩下的都是符合条件的。可以用容斥原理去求。
  • 对于状态 2,第一个装置已经在原点\((0, 0)\)了,而第二个装置的位置为\((0, k)\),设任意点坐标 \((x, y)\),向量叉乘运算,有 \((0, k)\times(x, y) = 2*s\),即\(|k*x|=2*s\),对于 \(1 \leq k \leq n\),求 \(k\) 为 \(2*s\) 因子的个数,找到\(2*s\)的素因子及个数,利用 DFS 求解。

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 5;
ll a[3]; // n m s
ll ans;
int isp[MAXN];
vector<int> prime;
struct factor {
ll x, cnt;
};
vector<factor> fac;
vector<ll> num;
void init() { // 素数筛
memset(isp, 0, sizeof isp);
for(int i = 2; i < MAXN; i++) {
if(!isp[i]) {
prime.push_back(i);
for(ll j = 1LL * i * i; j < (ll)MAXN; j += i) {
isp[j] = 1;
}
}
}
}
vector<factor> getfac(ll x) { // 筛选出质因子及其个数
vector<factor> vec;
for(int i = 0; (ll)prime[i] * prime[i] <= x; i++) {
int c = 0;
while(x % prime[i] == 0) {
c++;
x /= prime[i];
}
if(c) {
vec.push_back(factor{prime[i], c});
}
}
if(x > 1) {
vec.push_back(factor{x, 1});
}
return vec;
}
void dfs1(int pos, ll val, int cnt) { // 容斥
if(pos >= (int)num.size()) {
if(cnt & 1) ans -= a[1] / val;
else ans += a[1] / val;
return;
}
dfs1(pos + 1, val * num[pos], cnt ^ 1);
dfs1(pos + 1, val, cnt);
}
void solve1() { // 状态 1
num.clear();
fac.clear();
fac = getfac(a[0]);
for(int i = 0; i < (int)fac.size(); i++) {
ll sum = 1;
for(int j = 0; j < fac[i].cnt; j++) {
sum *= fac[i].x;
if(a[2] % sum != 0) {
num.push_back(sum);
break;
}
}
}
dfs1(0, 1, 0);
}
void dfs2(int pos, ll val) {
if(pos >= (int)fac.size()) {
ans += (val <= a[0]);
return;
}
ll sum = 1;
for(int i = 0; i <= fac[pos].cnt; i++) {
dfs2(pos + 1, val * sum);
sum *= fac[pos].x;
}
}
void solve2() { // 状态 2
fac.clear();
fac = getfac(a[2]);
dfs2(0, 1);
}
int main() {
int T;
init();
cin >> T;
while(T--) {
ans = 0;
for(int i = 0; i < 3; i++) {
a[i] = 1LL;
for(int j = 0; j < 3; j++) {
ll x;
cin >> x;
a[i] *= x;
}
}
a[2] *= 2;
solve1();
solve2();
cout << ans << endl;
}
return 0;
}

#421 Div1 C的更多相关文章

  1. CF#345 (Div1)

    论蒟蒻如何被cf虐 以下是身败名裂后的题解菌=========== Div1 A.Watchmen 有n个点,每个点有一个坐标.求曼哈顿距离=欧几里得距离的点对数量. 只需要统计x或y一样的点对数量. ...

  2. 图论 SRM 674 Div1 VampireTree 250

    Problem Statement      You are a genealogist specializing in family trees of vampires. Vampire famil ...

  3. jq对象转为dom对象:$(".div1")[0] dom对象转为jq对象:$(dom对象)

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  4. 第一次div1做出3道题

    第一次div1做出3道题! 再接再厉! 哈利路亚!

  5. 第一次进div1了

    第一次进div1~好激动啊! 上帝依旧那么眷顾我!

  6. TopCoder 649 div1 & div2

    最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...

  7. SRM DIV1 500pt DP

    SRM 501 DIV1 500pt SRM 502 DIV1 500pt SRM 508 DIV1 500pt SRM 509 DIV1 500pt SRM 511 DIV1 500pt SRM 5 ...

  8. codeforces #305 div1 done

    总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目 ...

  9. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

随机推荐

  1. Ubuntu15.04 python升级到python-3.6.x

    简略记录步骤,容后补充:   sudo add-apt-repository ppa:jonathonf/python-3.6   sudo apt-get update sudo apt-get i ...

  2. 关于MySQL查询优化 の 30条忠告

    撸自:http://www.jincon.com/archives/120/ 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避 ...

  3. 先立一个书单【flag】,敦促自己温故知新

    书单来源david mimno副教授给ML新生的建议博文,外加一部分搜罗的书籍 学习方式:以书籍查看,习题为辅,代码为最终实现方式,分主题进行今年的学习笔记,立此旗为证. 线代 --> 概率统计 ...

  4. ssh 免交互登录 ,远程执行命令脚本。

    ##免交互SSH登录auto_login_ssh () {    expect -c "set timeout -1;                spawn -noecho ssh -o ...

  5. HDU 4262 Juggler 树状数组

    将每个球按输入顺序编号,建立 它第几个被扔掉->编号 的映射关系. 记录当前在手里的球的编号,按扔掉的顺序查找这个球的编号,看看这个球是逆时针转到手里更近还是顺时针转到手里更近,即当前扔掉球的编 ...

  6. Pandas根据条件赋值

    我们有以下判断条件,我们想要更改B中的数, 而更改的位置是取决于 A 的. 对于A大于4的位置. 更改B在相应位置上的数为0. df.B[df.A>4] = 0

  7. java 中基本类型与字符串之间的互相转换

    1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下 ...

  8. jQuery选择器之元素选择器

    元素选择器:根据给定(html)标记名称选择所有的元素. 描述: $('element') 搜索指定元素标签名的所有节点,这是一个合集的操作.同样的也有原生方法getElementsByTagName ...

  9. hadoop2.6.4【ubuntu】单机环境搭建 系列1

    jdk安装 tar zxvf jdk mv jdk /usr/lib/jvm/java jdk环境变量配置 vim /etc/profile ``` export JAVA_HOME=/usr/lib ...

  10. HTTP3.0(QUIC的实现机制)

    回顾HTTP2.0 HTTP1.1在应用层以纯文本的形式进行通信,每次通信都要带完整的HTTP的头,而且不考虑pipeli模式的化,每次的过程总是像上面描述的那样一去一回.那样在实时性.并发想上都存在 ...