1. 程式人生 > >CSU Problem 1785 又一道簡單題——湖南省第十一屆大學生計算機程式設計競賽

CSU Problem 1785 又一道簡單題——湖南省第十一屆大學生計算機程式設計競賽

此文章可以使用目錄功能喲↑(點選上方[+])

 CSU Problem 1785 又一道簡單題

Accept: 0    Submit: 0
Time Limit: 5 Sec    Memory Limit : 128 MB

 Problem Description

輸入一個四個數字組成的整數 n,你的任務是數一數有多少種方法,恰好修改一個數字,把它 變成一個完全平方數(不能把首位修改成 0)。比如n=7844,有兩種方法:3844=62^2和 7744=88^2。

 Input

輸入第一行為整數 T (1<=T<=1000),即測試資料的組數,以後每行包含一個整數 n (1000<=n<=9999)。

 Output

對於每組資料,輸出恰好修改一個數字,把 n 變成完全平方數的方案數。

 Sample Input

2
7844
9121

 Sample Output

Case 1: 2
Case 2: 0

 Hint

 Problem Idea

解題思路:

【題意】
一個四位數n,問有多少種方案通過恰好修改一個數字,使得新得到的四位數是一個完全平方數


【型別】
暴力

【分析】

對於四位數n,格式如下:


最多有9000種情況,所以我們可以大膽的暴力求解

但在這之前,為了便於完全平方數的判定,我們可以先將四位數中的完全平方數給標記出來


因此,只需預處理出32~99的平方數,並做記錄

這樣就可以暴力修改某位數字,然後直接判斷是不是平方數

因為要恰好修改一位數字,所以不修改的肯定是不合要求的

還有就是最高位為0的也要抹殺掉

【時間複雜度&&優化】
O(n)

 Source Code

/*Sherlock and Watson and Adler*/
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<cmath>
#include<complex>
#include<string>
#include<algorithm>
#include<iostream>
#define eps 1e-9
#define LL long long
#define PI acos(-1.0)
#define bitnum(a) __builtin_popcount(a)
using namespace std;
const int N = 10005;
const int M = 4;
const int inf = 1000000007;
const int mod = 1000003;
bool v[N];
char s[M];
int main()
{
    int t,i,j,n,k,ans,p=1;
    for(i=32;i<100;i++)
        v[i*i]=true;
    scanf("%d",&t);
    while(t--)
    {
        ans=0;
        scanf("%s",s);
        n=atoi(s);
        for(k=1000,i=0;i<4;i++,k/=10)
            for(j=0;j<=9;j++)
            {
                if(i==0&&j==0||s[i]-'0'==j)
                    continue;
                if(v[n-(s[i]-'0'-j)*k])
                    ans++;
            }
        printf("Case %d: %d\n",p++,ans);
    }
    return 0;
}
菜鳥成長記