输入包括两个整数n和m(1 ≤ n ≤ 10^5, 1 ≤ m ≤ 10^5)
输出一个整数,表示满足条件的有序对对数。
3 8
5
#include<stdio.h> #include<map> #include<algorithm> using namespace std; const int MAXN=100005; int prime[MAXN+1],factor[100][2]; void getPrime(); int getFactors(int); int main(){ int n,m,res=0,i; getPrime(); scanf("%d%d",&n,&m); map<int,int> mpn,mpm; for(i=1;i<=n;i++) mpn[getFactors(i)]++; for(i=1;i<=m;i++) mpm[getFactors(i)]++; map<int,int>::iterator it; for(it=mpn.begin();it!=mpn.end();it++) if(mpm.count(it->first)) res+=it->second*mpm[it->first]; printf("%d",res); } void getPrime(){ for(int i=2;i<=MAXN;i++){ if(!prime[i])prime[++prime[0]]=i; for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++){ prime[prime[j]*i]=1; if(i%prime[j]==0) break; } } } int getFactors(int x){ int fatCnt=0,tmp=x,res=1,i; for(i=1;prime[i]<=tmp/prime[i];i++){ factor[fatCnt][1]=0; if(tmp%prime[i]==0){ factor[fatCnt][0]=prime[i]; while(tmp%prime[i]==0){ factor[fatCnt][1]++; tmp/=prime[i]; } fatCnt++; } } if(tmp!=1){ factor[fatCnt][0]=tmp; factor[fatCnt++][1]=1; } for(i=0;i<fatCnt;i++) if(factor[i][1]%2) res*=factor[i][0]; return res; }
import java.util.Scanner;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int num=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int A=(int) (Math.sqrt(i*j));
if(A==Math.sqrt(i*j)){
num++;
}
}
}
System.out.println(num);
}
}
通过率60%。 超时了。
import java.util.Scanner;
public class Main3 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
int cnt=0;
double a,b;
double sum;
int temp;
double result;
for(int i=1;i<=n;i++){
a=Math.sqrt(i);
for(int j=1;j<=m;j++){
b=Math.sqrt(j);
System.out.println(a+" "+b);
sum=a+b;
result= Math.pow(sum, 2);
temp=(int ) result;
if(result==temp)
cnt++;
}
}
System.out.println(cnt);
}
}
为什么我的暴力求解不对呢,简单的测试用例2,2 3,8 都不对 实在想不出 漏了什么情况啊
链接:https://www.nowcoder.com/questionTerminal/6524263a0cc9427ebb0af10b3f366774 来源:牛客网#include<stdio.h>#include<math.h>intpend[100005];voidgetPend(intm){intrec;for(inti=2,rec=i*i;rec<=m;i++,rec=i*i){if(pend[rec])continue;for(intj=rec;j<=m;j+=rec)pend[j]=1;}}intmain(){intn,m;scanf("%d%d",&n,&m);intsn=(int)sqrt(n),sm=(int)sqrt(m);longlongans=sn*sm;getPend(n>m?m:n);for(inti=2;;i++){if(pend[i])continue;if(n/i==0||m/i==0)break;intnt=n/i,mt=m/i;intsnt=(int)sqrt(nt),smt=(int)sqrt(mt);ans+=snt*smt;}printf("%lld",ans);return0;}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main{
public static int MAX_VALUE;
public static void solve(){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
if(n>=m) MAX_VALUE = n;
else MAX_VALUE = m;
boolean[] primeList = new boolean[MAX_VALUE+1];
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
ArrayList<Integer> primes = new ArrayList<>();
int[] countlist1 = new int[n+1];
int[] countlist2 = new int[m+1];
primeList[1] = true;
for(int i=2;i<=Math.sqrt(MAX_VALUE);i++){
for(int j=i*2;j<=MAX_VALUE;j+=i){
primeList[j] = true;
}
}
for(int i=1;i<=MAX_VALUE;i++){
if(!primeList[i])
{
primes.add(i);
}
}
helper(n,list1,countlist1,primes);
//System.out.println("");
helper(m,list2,countlist2,primes);
//System.out.println("");
int result = 0;
int min = m;
if(n<m){
min = n;
}
for(int i=2;i<=min;i++){
result += countlist1[i]*countlist2[i];
}
int count1 = (int) Math.sqrt(n);
int count2 = (int) Math.sqrt(m);
result+= count1*count2;
System.out.println(result);
}
private static void helper(int n,ArrayList<Integer> list,int[] countlist,ArrayList<Integer> primes){
for(int i=2;i<=n;i++){
int result = 1;
int curr = i;
for(Integer prime: primes){
if(prime>curr) break;
if(curr%prime==0){
if(curr%(prime*prime)==0){
int walk = curr;
int times = 0;
while(walk>1 && walk%prime==0){
times++;
walk = walk/prime;
curr = curr/prime;
}
if(times%2==1){
result*=prime;
}
}
else{
result*=prime;
curr /= prime;
}
}
}
if(result!=1)
{
list.add(result);
countlist[result]++;
//System.out.print(result+" ");
}
result = 1;
}
}
public static void main(String[] args){
solve();
}
}
#include<stdio.h> #include<math.h> int pend[100005]; void getPend(int m) { int rec; for(int i=2,rec=i*i;rec<=m;i++,rec=i*i) { if(pend[rec]) continue; for(int j=rec;j<=m;j+=rec) pend[j]=1; } } int main() { int n,m; scanf("%d%d",&n,&m); int sn=(int)sqrt(n),sm=(int)sqrt(m); long long ans=sn*sm; getPend(n>m?m:n); for(int i=2;;i++) { if(pend[i]) continue; if(n/i==0||m/i==0) break; int nt=n/i,mt=m/i; int snt=(int)sqrt(nt),smt=(int)sqrt(mt); ans+=snt*smt; } printf("%lld",ans); return 0;}//个人观点
#include <iostream>
#include <map>
int sqare[1010];
int symbol[100100];
int Prefix(const int val) {
int ans = val;
for (int i = 1; i <= 1000; ++i) {
if (sqare[i] > val) {
break;
}
if (val % sqare[i] == 0) {
ans = std::min(ans,val / sqare[i]);
}
}
return ans;
}
void Init() {
for (int i = 0; i <= 1000; ++i) {
sqare[i] = i * i;
}
for (int i = 0; i <= 100010; ++i) {
symbol[i] = Prefix(i);
}
}
int main()
{
Init();
int n,m;
while (std::cin >> n >> m) {
int min_value = std::min(n,m);
int max_value = std::max(n,m);
std::map<int,int> mp;
for (int i = 1; i <= min_value; ++i ) {
++mp[symbol[i]];
}
long long ans = 0;
for (int i = 1; i <= max_value; ++i) {
ans += mp[symbol[i]];
}
std::cout << ans << std::endl;
}
return 0;
}