TYVJ1669 周瑜的刁难

首先YM XLK大犇犇

BlinKer  20:45:36
傻逼暴力。
等会我写。。
大概意思就是如果是R*C的

R+C-gcd(R,C)
BlinKer  20:46:15
显然gcd(R,C)是n的约数。
暴力这个东西。
一共是lgn种可能。
然后On暴力R或C
算另一个。
看是不是gcd为那个数。
 
从以上的文字中很容易可以看出这样的水题对于大犇来说已经不值一提了。
作为一个蒟蒻,我整理一下大犇的思想:
观察或者打表或者数学推导(一般大犇都这么搞的),可以发现,穿过的网格数等于r+c-gcd(r,c)。
然后就有r+c-gcd(r,c)=n
即r+c=n+gcd(r,c)
两边除gcd(r,c)
可知gcd(r,c)一定是N的因数(其他三个都是整数)
所以预处理出N的因数,再穷举R判断即可
 
Code:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

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

int num[10001];

int main(){
	int n,t=0;
	cin >>n;
	for (int i=1;i<=int(sqrt(n));i++)
	    if (n%i==0){
			num[++t]=i;num[++t]=n/i;
			if (num[t]==num[t-1]) t--;
	    }
	int ans=0;
	for (int r=1;r<=n;r++)
	    for (int i=1;i<=t;i++){
			int c=n+num[i]-r;
			if ((c<=r)&&(gcd(c,r)==num[i])){
				ans++;
			}
		}
	cout <<ans <<endl;
	return 0;
}

 

转载于:https://www.cnblogs.com/JS-Shining/archive/2012/06/02/2532235.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值