您的位置:首页 > 其它

几道数学题目

2012-05-25 10:19 190 查看
poj 1026 http://poj.org/problem?id=1026
题意:给你(乱序)数字,数字表示下面输入的字符串变幻的位置。比如说事例给的

10(n)

4 5 3 7 2 8 1 6 10 9

1(k) Hello Bob

1 代表对字符串中每一个字符进行变幻的次数。

变幻的方式就是

1 2 3 4 5 6 7 8 9 10(十个数排完序后)

H e l l o B o b

4 5 3 7 2 8 1 6 10 9

这样经过 1 次变幻后,H到第四个位置(也就是字符串下标为 3 的位置)e变幻到第 5 个位置,依次类推。当然,如果 k 不等于 1,例如 k = 4, H 的变幻路径为 4 -> 7 -> 1 -> 4

e的变幻路径为 2 -> 5 -> 2 -> 5 -> 2依次类推

思路:其实模拟就行了,但是要加一些优化,否则会超时的。从上面可以看出,因为答案只是让求出每个字符的最终位置,可以求出所给的n个数的每一个的循环次数,这样用k取余循环次数,可以减少很多不必要的操作

注意题目输出字符串时要求必须是 n 的长度,样例给的那个输出后面没有多余的空格,真是坑死人了。还有就是每个block后还要再输出一个空行,但是用puts输出就会PE,用printf输出就AC了,上网查了一下区别,只是说puts只是用来输出字符串的,其他的也没查出什么区别

View Code

#include <iostream>
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <algorithm>

using namespace std;

int gcd(int a,int b)
{
if(!b) return a;
else return gcd(b,a % b);
}
int main()
{
int n,i;
long long sum;
//freopen("data.txt","r",stdin);
while(cin>>n,n != -1)
{
sum = 0;
if(!n)
{
cout<<"0\n";continue;
}
for(i = 1; i <= n; i++)
{
sum +=  (pow(3.0,gcd(n,i)));
}
if(n % 2 == 0)
{
sum +=  ((pow(3.0, n / 2 ) * (n / 2)));
sum +=   ((pow(3.0, (n + 2) / 2) * (n / 2)));
}
else sum +=  ((pow(3.0, (n + 2) / 2) * n));
sum = sum / (2 * n);
printf("%lld\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: