2013 南京邀请赛 K题 yet another end of the world


 1 /**
2 大意:给定一组x[],y[],z[] 确定有没有两个不同的x[i], x[j] 看是否存在一个ID使得
3 y[i]<=ID%x[i]<=z[i]
4 y[j]<=ID%x[j]<=z[j]
5 设ID%x[i] = a ID%x[j] = b
6 ===〉ID+x[i]*x=a, ID+x[j]*y = b;
7 两式相减得 x[j]*y - x[i]*x = b-a;
8 若是有解 就是(b-a)%gcd(x[i],x[j]) == 0
9 就是看b-a的范围内是否有数是 gcd(x[i],x[j]) 的倍数
10 因为 y[j]<=b<=z[j] y[i]<=a<=z[i]
11 所以 y[j]-z[i]<=b-a<=z[j]-y[i]
12
13 欠缺; 还是思路不够,,做题太少。。
14 **/
15
16 #include <iostream>
17 #include <algorithm>
18 using namespace std;
19 long long x[1010],y[1010],z[1010];
20
21 long long gcd(long long a,long long b){
22 if(b==0)
23 return a;
24 return gcd(b,a%b);
25 }
26
27 bool check2(int d,int l,int r){
28 if(l%d==0||r%d==0)
29 return true;
30 if((r-l+1)>=d)
31 return true;
32 int t1 = l/d;
33 int t2 = r/d;
34 if(t1!=t2)
35 return true;
36 else
37 return false;
38 }
39
40 bool check(int i,int j){
41 if(y[i]>z[j]||y[j]>z[i]){
42 if(z[j]<y[i])
43 swap(i,j);
44 long long d = gcd(x[i],x[j]);
45 if(check2(d,y[j]-z[i],z[j]-y[i]))
46 return true;
47 else
48 return false;
49 }else
50 return true;
51 }
52
53 int main()
54 {
55 int n;
56 while(cin>>n){
57 for(int i=0;i<n;i++)
58 cin>>x[i]>>y[i]>>z[i];
59 bool flag = false;
60 for(int i=0;i<n;i++){
61 for(int j=i+1;j<n;j++){
62 if(check(i,j)){
63 flag = true;
64 break;
65 }
66 }
67 }
68 if(!flag){
69 cout<<"Can Take off"<<endl;
70 }else{
71 cout<<"Cannot Take off"<<endl;
72 }
73 }
74 return 0;
75 }

2013 南京邀请赛 K题 yet another end of the world

时间: 2024-11-05 22:49:00

2013 南京邀请赛 K题 yet another end of the world的相关文章

hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。

题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有的连通分量只有一个点,当舍去该点时候,连通分量-1: 复习求割点的好题! #include<iostream> #include<cstdio> #include<vector> using namespace std; int n,m; vector<vector&

2013 南京邀请赛 A play the dice 求概率

1 /** 2 大意:给定一个色子,有n个面,每一个面上有一个数字,在其中的m个面上有特殊的颜色,当掷出的色子出现这m个颜色之一时,可以再掷一次..求其最后的期望 3 思路:假设 期望为ans 4 ans = 1/n*(a[b[1]]+ans)+1/n*(a[b[2]]+ans)+....+1/n*(a[b[m]]+ans) +...+1/n*(a[k]).... 5 ans = m/n*ans+1/n*(a[1]+a[2]+a[3]+...a[n]) 6 ans = m/n*ans+sum/n

2013 南京邀请赛 C count the carries

1 /** 2 大意: 给定区间(a,b), 将其转化为二进制 计算从a+(a+1)+(a+2)....+(a+b-1),一共有多少次进位 3 思路: 将(a,b)区间内的数,转化为二进制后,看其每一位一共有多少个1 4 可知最低位循环为2,第二位循环为4 5 ---〉 所以每一位的1的个数为 : 假设为第三位 (n-n%8)/8*8/2===>(n-n%8)/2 6 ------> 如果n%8 大于8/2 那么应该再加上 n%8-8/2 7 **/ 8 #include <iostre

BNUOJ 34985 Elegant String 2014北京邀请赛E题 动态规划 矩阵快速幂

Elegant String Time Limit: 1000msMemory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main We define a kind of strings as elegant string: among all the substrings of an elegant string, none of them is a permutation of "0, 1,-, k

2014 BNU 邀请赛E题(递推+矩阵快速幂)

Elegant String 题意:给定一个字符串,由0-k数字组成,要求该串中,子串不包含0-k全排列的方案数 思路:dp[i][j]表示放到i个数字,后面有j个不相同,然后想递推式,大概就是对应每种情况k分别能由那几种状态转移过来,在纸上画画就能构造出矩阵了,由于n很大,所以用快速幂解决 代码: #include <stdio.h> #include <string.h> const long long MOD = 20140518; int t; long long n; i

2013 长沙邀请赛 ADEGH 题解

HDU 4565 So Easy! 类似fib的构造 设Fn = x + y*sqrt(b) 啪啦啪啦 #include <cstdio> #include <cstring> #include <vector> #include <cmath> #include <iostream> using namespace std; typedef vector<long long> vec; typedef vector<vec&g

BNUOJ 34985 Elegant String 2014北京邀请赛E题 矩阵快速幂

题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 题目大意:问n长度的串用0~k的数字去填,有多少个串保证任意子串中不包含0~k的某一个全排列 邀请赛上A的较多的一道题,比赛的时候死活想不出,回来之后突然就想通了,简直..... = =! 解题思路: 对于所有串我们都只考虑末尾最多有多少位能构成全排列的一部分(用l来表示),即最多有多少位不重复的数字出现,将问题转化为求末尾最多有k位能构成全排列的串的总数量 假设k为5,有一个

2014北京邀请赛E题-矩阵快速幂

题意:长度为n(1<=n<=10^18)的并且任意连续子串都不是0-k(1<=k<=9)的一个排列的字符串有多少种. 解法:矩阵快速幂.dp[i][j]表示i长度最后连续j个不同(即最后j个无重复,最后j+1个有重复)的字符串的个数.状态选好很重要.设计状态时最重要考虑是唯一性和可传递性,比赛时明明知道肯定是矩阵快速幂,但是一直没想到这个状态表示,自己设计的自己都不会转移. dp[i][j]有了后,后边加一个字符,这个字符可以是j之内的任意一个,也可以是j以外的,这样枚举每种情况,

A Computer Graphics Problem 4176 2013上海邀请赛

A Computer Graphics Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 968    Accepted Submission(s): 688 Problem Description In this problem we talk about the study of Computer Graphics.