HDU 1337 && POJ 1218&& zju 1350 方法总结

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1337 杭电  

http://poj.org/problem?id=1218清华

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1350浙江

原本以为小小的一道水题不值得去总结,但是发现却有好多方法,好神奇啊

方法一:数据挺小的模拟就好 

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;

int a[110];
int main()
{
    int t, n;
    scanf("%d", &t);
    while(t--)
    {
        memset(a, 0, sizeof(a));
        scanf("%d", &n);
        for(int i=1; i<=n; i++)
        {
            for(int j=i; j<=n; j+=i)
            {
                a[j]=a[j]^1;
            }
        }
        int ans=0;
        for(int i=1; i<=n; i++)
        {
            if(a[i]==1)
                ans++;
        }

        printf("%d\n", ans);
    }
    return 0;
}

方法二:其实犯人是否能够逃跑是有规律可循的,门有开/关两种形式,只要犯人最终开和关的总次数是奇数就好;例如3 1开3关 ,开关总和为偶数; 例如4 1开2关4开,开关总和为奇数  其实就是看一个数是否有奇数个因子;

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;

int solve(int x)
{
    int cnt=0;
    for(int i=1; i<=x; i++)
    {
        if(x%i==0)
            cnt++;
    }
    if(cnt%2==0)
        return 0;
    else
        return 1;
}
int main()
{
    int t, n;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        int ans=0;
        for(int i=1; i<=n; i++)
        {
           if(solve(i))
            ans++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

第三种:是看别人才知道的,真的是世界之大无奇不有;

原理是:只有完全平方数才有奇数个因子,例如3, 9,所以只需要求出n以内的完全平方数的个数即可;

n以内的 完全平方数的个数=sqrt(n);

#include<cstdio>
#include<cmath>
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        printf("%d\n",(int)sqrt(n));
    }
    return 0;
}

  

posted @ 2015-08-19 21:17  花开须臾  阅读(179)  评论(0编辑  收藏  举报