当前位置: 代码迷 >> 综合 >> CSU Problem 1785 又一道简单题——湖南省第十一届大学生计算机程序设计竞赛
  详细解决方案

CSU Problem 1785 又一道简单题——湖南省第十一届大学生计算机程序设计竞赛

热度:94   发布时间:2023-12-12 09:56:01.0

此文章可以使用目录功能哟↑(点击上方[+])

 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)

题目链接→CSU Problem 1785 又一道简单题

 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;
}
菜鸟成长记

  相关解决方案