SGU 107: 987654321 problem

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=107

题目大意:

      求出多少个N位数的平方末尾是987654321。

解题思路:

      因为末尾多少是跟后几位相乘有关的,所以先试探一些值,9位以下都没有解,9位有8个,10位有8*9个,递推下去11位以上就是8*9*(n-10)个。因为n的范围是10^6,所以用公式不能算,会溢出,这里用了一个小技巧,因为后面都是0,所以算10位后面就直接输出输出72然后加上(n-10)个0。

解题代码:

#include<iostream>
using namespace std;

int main(){
	int n;
	cin>>n;
	if(n<9)
		cout<<0<<endl;
	else if(n==9)
		cout<<8<<endl;
	else if(n==10)
		cout<<72<<endl;
	else{
		cout<<72;
		for(int i=1;i<=n-10;i++)
			cout<<0;
		cout<<endl;
	}
	return 0;
}

扩展知识:http://blog.csdn.net/ZERO2046/archive/2007/05/20/1618507.aspx

SGU 135: Drawing Lines

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=135

题目大意:

     n条直线能把平面分成最多几个空间。

解题思路:

      可以推出f(n)=f(n-1)+n;然后扩展得到$$f(n)=\frac{n*(n+1)}{2}+1$$.

解题代码:

#include<iostream>
using namespace std;
int main(){
	long long n;
	cin>>n;
	cout<<(n*(n+1)/2+1)<<endl;
	return 0;
}

扩展知识:http://mathworld.wolfram.com/CircleDivisionbyLines.html

SGU 105: Div 3

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=105

题目大意:

      有一个数列1,12,123,1234,...,12345678910,1234567891011,...,求第N个数前有几个数能被3整除包括N.

解题思路:

      能被3整除的数的特点是各个位上的和加起来能被3整除,看规律可知每3个数中有一个数不能被3整除,那个数就是序数跟3取模是1的那个数。

解题代码:

     

#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
	long long n,t,m;
	while(cin>>n){
		m=n/3*2;
		if(n%3!=0){
			t=n%3-1;
			m+=t;
		}
		cout<<m<<endl;
	}
	return 0;
}

扩展知识:http://en.wikipedia.org/wiki/Divisibility_rule