2018京东校招笔试题-数据分析岗
2017-09-10 14:44
507 查看
题目大意是给出一个数字n,问a^b=c^d(1<=a、b、c、d<=n)这种式子的个数 1^2=1^1 1^1=1^2,这样的算两个,n<=100000.
首先分析题目,n的数据范围肯定是不能暴力的,从其他同学的反馈也表示这题暴力只能过20%
此题的规律在于,以一个较小的数字a当基底 将 a^p 和 a^q(设为m,n)当做新的底来计算m^c=n^d(m、n<=n),才能避免重复和漏判
比如4(2^2)和8(2^3),此时需要计算2和3的最小公倍数,然后再计算在幂指数不超过n的情况下满足4^c=8^d的式子的个数
比如从2^k开始,分别计算底为2^k和(2^(k+1)一直到2^s(2^s<=n&&s>=k+1))的式子,同时要将2^k置为已访问过,防止重复计算(2^k<=n)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <algorithm>
#define LL long long
using namespace std;
const LL p = 1e9+7;
LL gcd(LL a,LL b){
LL m=a,n=b,c;
while(b!=0){
c=a%b; a=b; b=c;
}
LL sum=m*n/a;
return sum;
}
LL mizhishu(LL n,LL k){
LL sum=1;
for(LL i =0;i<k;i++){
sum*=n;
}
return sum;
}
LL n;
LL ans=0;
LL hash_n[101000];
int main(){
cin>>n;
memset(hash_n,0,sizeof(hash_n));
if(n==1){
cout<<1<<endl;
return 0;
}
LL k;
LL k1;
LL k2;
LL sum;
ans=0;
ans+=(n*n)%p;
ans%=p;
//cout<<ans<<endl;
for(LL i=2;i<=n;i++){
ans+=n;
ans%=p;
if(hash_n[i]==0){
k=1;
while(mizhishu(i,k)<=n){
//cout<<mizhishu(i,k)<<endl;
//ans+=2*(n/k);
hash_n[mizhishu(i,k)]=1;
k1 = k+1;
while(k1<=n&&mizhishu(i,k1)<=n){
sum = gcd(k,k1);
//cout<<"i:"<<i<<" k: "<<k<<" k1: "<<k1<<" sum:"<<sum<<endl;
ans+=2*(n*k/(sum));
ans%=p;
k1++;
}
ans%=p;
k++;
}
}
}
ans%=p;
cout<<ans<<endl;
return 0;
}
首先分析题目,n的数据范围肯定是不能暴力的,从其他同学的反馈也表示这题暴力只能过20%
此题的规律在于,以一个较小的数字a当基底 将 a^p 和 a^q(设为m,n)当做新的底来计算m^c=n^d(m、n<=n),才能避免重复和漏判
比如4(2^2)和8(2^3),此时需要计算2和3的最小公倍数,然后再计算在幂指数不超过n的情况下满足4^c=8^d的式子的个数
比如从2^k开始,分别计算底为2^k和(2^(k+1)一直到2^s(2^s<=n&&s>=k+1))的式子,同时要将2^k置为已访问过,防止重复计算(2^k<=n)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <algorithm>
#define LL long long
using namespace std;
const LL p = 1e9+7;
LL gcd(LL a,LL b){
LL m=a,n=b,c;
while(b!=0){
c=a%b; a=b; b=c;
}
LL sum=m*n/a;
return sum;
}
LL mizhishu(LL n,LL k){
LL sum=1;
for(LL i =0;i<k;i++){
sum*=n;
}
return sum;
}
LL n;
LL ans=0;
LL hash_n[101000];
int main(){
cin>>n;
memset(hash_n,0,sizeof(hash_n));
if(n==1){
cout<<1<<endl;
return 0;
}
LL k;
LL k1;
LL k2;
LL sum;
ans=0;
ans+=(n*n)%p;
ans%=p;
//cout<<ans<<endl;
for(LL i=2;i<=n;i++){
ans+=n;
ans%=p;
if(hash_n[i]==0){
k=1;
while(mizhishu(i,k)<=n){
//cout<<mizhishu(i,k)<<endl;
//ans+=2*(n/k);
hash_n[mizhishu(i,k)]=1;
k1 = k+1;
while(k1<=n&&mizhishu(i,k1)<=n){
sum = gcd(k,k1);
//cout<<"i:"<<i<<" k: "<<k<<" k1: "<<k1<<" sum:"<<sum<<endl;
ans+=2*(n*k/(sum));
ans%=p;
k1++;
}
ans%=p;
k++;
}
}
}
ans%=p;
cout<<ans<<endl;
return 0;
}
相关文章推荐
- 2018京东校招Java笔试题
- 2017校招数据分析岗笔试、面试知识点大总结
- 【2018校招笔试-京东=java开发】题目2 求幂
- 2018链家校招内推-大数据开发工程师笔试编程题
- 京东2018校招在线笔试编程题①
- 京东2018校招Web前端工程师笔试有感
- 【2018校招笔试-京东=java开发】题目1括号匹配方案
- 2017校招数据分析岗笔试/面试知识点
- 【2014校招】京东网银在线笔试
- 2017年京东校招Java研发笔试编程第1题
- 京东文胸数据分析
- 美图2018校招前端笔试编程题数组去重
- 数据分析与数据挖掘方面招聘的笔试题分享
- 网易互娱2018数据挖掘实习生(2019届)笔试
- 搜狐2018校招笔试题
- 针对外部存储器(如磁盘)上存放的程序和数据,说法正确的是()。----阿里巴巴2015校招研发在线笔试题
- 19 Feb 12 百度2012校招笔试题分析
- Python爬虫爬取京东内存条数据并作简单分析
- 编程题(1):笔试题-京东软件测试2018实习招聘
- 京东笔试题-激光炮(分析转换简化问题)