Problem G: 平方根的和的平方
Time Limit: 2 Sec Memory Limit: 128 MB
Submit: 9 Solved: 1
Description
平方根的和的平方SSR (Squared Sum of square Roots),是一个函数:
SSR(A, B) = (sqrt(A)+sqrt(B))^2。
给出整数N,M。求有序对(A,B)的数量,满足1 <= A <= N, 1 <= B <= M 并且SSR(A, B) 是整数。
Input
第一行为数据组数。
接下来每行是一组数据,有两个数N,M。都在1和77777之间。
Output
每组数据一行,你的答案。数据保证答案用带符号32位整数可以正确储存。
Sample Input
1
2 2
Sample Output
2
/*
数学题,要用到的数学知识蛮多的,所以记录下。。
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define manx 80000
using namespace std;
int dp[manx],p[manx],num;
bool s[manx];
int n,m;
void prime(){
for(int i=0;i<manx;i++) s[i]=0;
for(int i=2;i*i<manx;i++){
if(!s[i]){
for(int j=2;j*i<manx;j++ )
s[i*j]=1;
}
}
num=0;
for(int i=2;i<manx;i++)
if(!s[i]) p[num++]=i;
}
void init(){
dp[1]=1; dp[0]=0;
for(int i=2;i<manx;i++){// 对平方和数进行打表
dp[i]=0;
double m=(double)i;
double k=ceil(pow(m,1.0/2));
if(pow(k,2.0)==m) dp[i]=1;
dp[i]+=dp[i-1];
}
}
int main(){
init();
prime();
int t;
cin>>t;
while(t--){
scanf("%d%d",&n,&m);
int sum=dp[m];
for(int i=2;i<=n;i++){
if(!s[i]) {
if(i>m) continue;//
sum += dp[m/i];
continue;
}
int d=i,r=1;
for(int j=0;p[j]*p[j]<=d;j++){
int f=0;
while(d%p[j]==0){
f++;
d/=p[j];
}
if(f%2) r*=p[j];
}
if(d>1) r*=d;//
if(r>m) continue;///
sum += dp[m/r];
}
cout<<sum<<endl;
}
}
Problem G: 平方根的和的平方
Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 9 Solved: 1
Description
平方根的和的平方SSR (Squared Sum of square Roots),是一个函数:
SSR(A, B) = (sqrt(A)+sqrt(B))^2。
给出整数N,M。求有序对(A,B)的数量,满足1 <= A <= N, 1 <= B <= M 并且SSR(A, B) 是整数。
Input
第一行为数据组数。
接下来每行是一组数据,有两个数N,M。都在1和77777之间。
Output
每组数据一行,你的答案。数据保证答案用带符号32位整数可以正确储存。
Sample Input
1
2 2
Sample Output
2
/* 数学题,要用到的数学知识蛮多的,所以记录下。。 */ #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define manx 80000 using namespace std; int dp[manx],p[manx],num; bool s[manx]; int n,m; void prime(){ for(int i=0;i<manx;i++) s[i]=0; for(int i=2;i*i<manx;i++){ if(!s[i]){ for(int j=2;j*i<manx;j++ ) s[i*j]=1; } } num=0; for(int i=2;i<manx;i++) if(!s[i]) p[num++]=i; } void init(){ dp[1]=1; dp[0]=0; for(int i=2;i<manx;i++){// 对平方和数进行打表 dp[i]=0; double m=(double)i; double k=ceil(pow(m,1.0/2)); if(pow(k,2.0)==m) dp[i]=1; dp[i]+=dp[i-1]; } } int main(){ init(); prime(); int t; cin>>t; while(t--){ scanf("%d%d",&n,&m); int sum=dp[m]; for(int i=2;i<=n;i++){ if(!s[i]) { if(i>m) continue;// sum += dp[m/i]; continue; } int d=i,r=1; for(int j=0;p[j]*p[j]<=d;j++){ int f=0; while(d%p[j]==0){ f++; d/=p[j]; } if(f%2) r*=p[j]; } if(d>1) r*=d;// if(r>m) continue;/// sum += dp[m/r]; } cout<<sum<<endl; } }