1. 程式人生 > >hdu 2051 Switch Game(模擬/數論)

hdu 2051 Switch Game(模擬/數論)

題目意思:

給你n個燈,剛開始全滅,問經過無窮多次操作後,求第n個燈的狀態。

題目分析:

見程式碼註釋。

AC程式碼:

/**
  *@xiaoran
  *應該是數論問題,先模擬看看(過了),現在來看這道題
  *題意:給你n個燈,剛開始全滅,問經過無窮多次操作後,第n個燈狀態
  *對於第i次操作,改變所有i的倍數的狀態
  *發現當操作到n+1次之後肯定不會對n有影響,此題變為操作n次之後的n的狀態
  *下面分析:剛開始n的狀態為0,如果對第n個燈操作了偶數次,其狀態還是0,
  *操作奇數次變為1,現在來分析對於n:如果i是n的約數,就會改變n的狀態,但是
  *j=n/i也是n的約數,還會把n的狀態改變回來,到這裡可以發現當i=n/i的時候,才會
  *對n的狀態發生影響,剛開始n狀態為0,如果n是個完全平方數,則會變為1.
  */
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cmath>
#define LL long long
using namespace std;
int a[100005];
int main()
{
    int n;
    while(cin>>n){
        int k=(int) (sqrt(n)+0.5);
        k*k==n?printf("1\n"):printf("0\n");
        /**模擬
        memset(a,1,sizeof(a));
        for(int i=2;i<=n;i++){
            for(int j=i;j<=n;j+=i){
                a[j]=!a[j];
            }
        }
        if(n==1) printf("1\n");
        else printf("%d\n",a[n]);
        **/
    }
	return 0;
}