Uva 1393 - Highways 解题报告(递推)

96 篇文章 0 订阅

Hackerland is a happy democratic country with m×n cities, arranged in a rectangular m by n grid and connected by m roads in the east-west direction and n roads in the north-south direction. By public demand, this orthogonal road system is to be supplemented by a system of highways in sucha way that there will be a direct connection between any pair of cities. Each highway is a straight line going through two or more cities. If two cities lie on the same highway, then they are directly connected.If two cities are in the same row or column, then they are already connected by the existing orthogonal road system (each east-west road connects all the m cities in that row and each north-south road connects all the n cities in that column), thus no new highway is needed to connect them. Your task is to count the number of highway that has to be built (a highway that goes through several cities on a straight line is counted as a single highway).

\epsfbox{p3720.eps}

Input 

The input contains several blocks of test cases. Each test case consists of a single line containing two integers 1$ \le$n , m$ \le$300 , specifying the number of cities. The input is terminated by a test case with n = m = 0 .

Output 

For each test case, output one line containing a single integer, the number of highways that must be built.

Sample Input 

2 4
3 3
0 0

Sample Output 

12
14

    解题报告: 很好的一道递推题。300*300=90000点,要非常小心复杂度。

    具体怎么做呢?按照样例中的第二个图来说,左上角设为(1, 1)点,右下角设为(3, 3)点。首先我们可以只求斜率为正的直线,计算结果时直接乘2,因为是完全对称的。然后看(3,3)点,与该点连接成直线的点有(2,2),(1,2),(2,1),而(1,1)点重复了。为什么(1,1)点重复了?因为(3,3)点与(1,1)点构成的向量是(2,2),那么(3,3)点与(1,1)向量构成的直线必然穿过与(2,2)向量构成的直线。简单来说,就是(2,2)向量不互质。

    那么,如果我们要计算与(m,n)点相连的直线的数量,我们就必须求出[1, m)区间与[1, n)区间互质数的对数。

    预处理所有可能点内的互质数的对数。注意复杂度。然后我们就知道了每个点可以连接的直线的数量。但是直接求和并不是最终解。继续看(3,3)点与(2,2)点连接的直线,这条线在(2,2)点连接(1,1)时已经计算过了。换句话说计算(m,n)点连接的直线数时得减去(m/2,n/2)区间内的直线数,该区间内的直须必然是之前就计算过的。

    这样求和即可,复杂度大约为90000*3。代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long LL;
LL co_prime[333][333];
LL sum[333][333];
LL t_sum[333][333];

int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}

void init()
{
    for(int i=1;i<=300;i++)
        for(int j=1;j<=300;j++)
            co_prime[i][j] = co_prime[i][j-1]+(gcd(i,j)==1?1:0);

    for(int i=1;i<=300;i++)
        for(int j=1;j<=300;j++)
            sum[i][j]=sum[i-1][j]+co_prime[i][j];

    for(int i=1;i<=300;i++)
        for(int j=1;j<=300;j++)
            t_sum[i][j]= t_sum[i-1][j] + t_sum[i][j-1] - t_sum[i-1][j-1]
                       + sum[i][j] - sum[i/2][j/2];
}

int main()
{
    init();

    int m,n;
    while(~scanf("%d%d",&n,&m) && (n||m))
        printf("%lld\n", t_sum[n-1][m-1]*2);
}

    这道题并不简单,训练指南里的中档题,我想了一下午了。不过很锻炼思维了。与之有些相似的题目有:

HDU 2841 Visible Trees,解题报告在这里:HDU 2841 Visible Trees 解题报告(筛 or 容斥原理)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sklearn中自带了波士顿房价数据集,可以通过以下代码导入: ``` from sklearn.datasets import load_boston boston = load_boston() X = boston.data # 特征矩阵 y = boston.target # 目标向量 ``` 其中,X是一个13维的特征矩阵,y是一个样本数量为506的目标向量。可以通过以下代码查看数据集的描述: ``` print(boston.DESCR) ``` 输出结果如下: ``` .. _boston_dataset: Boston house prices dataset --------------------------- **Data Set Characteristics:** :Number of Instances: 506 :Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target. :Attribute Information (in order): - CRIM per capita crime rate by town - ZN proportion of residential land zoned for lots over 25,000 sq.ft. - INDUS proportion of non-retail business acres per town - CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise) - NOX nitric oxides concentration (parts per 10 million) - RM average number of rooms per dwelling - AGE proportion of owner-occupied units built prior to 1940 - DIS weighted distances to five Boston employment centres - RAD index of accessibility to radial highways - TAX full-value property-tax rate per $10,000 - PTRATIO pupil-teacher ratio by town - B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town - LSTAT % lower status of the population - MEDV Median value of owner-occupied homes in $1000's :Missing Attribute Values: None :Creator: Harrison, D. and Rubinfeld, D.L. This is a copy of UCI ML housing dataset. https://archive.ics.uci.edu/ml/machine-learning-databases/housing/ This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University. The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic prices and the demand for clean air', J. Environ. Economics & Management, vol.5, 81-102, 1978. Used in Belsley, Kuh & Welsch, 'Regression diagnostics ...', Wiley, 1980. N.B. Various transformations are used in the table on pages 244-261 of the latter. The Boston house-price data has been used in many machine learning papers that address regression problems. **References** - Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261. - Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值