CSU Problem 1785 又一道簡單題——湖南省第十一屆大學生計算機程式設計競賽
阿新 • • 發佈:2019-02-12
此文章可以使用目錄功能喲↑(點選上方[+])
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
27844
9121
Sample Output
Case 1: 2Case 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; }