#include<stdio.h>
#include<bitset>
#include<algorithm>
#include<iostream>
int nums[10]={63,3,118,103,75,109,125,15,127,111};
int wa(int n){
int re=0;
while(n>0){
re+=n%10;
n/=10;
}
return re;
}
int max(int n,int m){
if(n<m){
std::swap(n,m);
}
std::bitset<8> bs;
int re=0;
while(n>0){
if(m>0){
bs=(nums[n%10]^nums[m%10]);
}else{
bs=nums[n%10];
}
re+=bs.count();
n/=10;
m/=10;
}
return re;
}
int sam(int n){
std::bitset<8> bs;
int re=0;
while(n>0){
bs=nums[n%10];
re+=bs.count();
n/=10;
}
return re;
}
int calc(int n){
int n1=wa(n);
if(n1==n){
return sam(n);
}else{
return sam(n)*2-max(n,n1)+calc(n1);
}
}
bool isPrime(int n){
for(int i=2;i*i<=n;i+=1+(i&1)){
if(n%i==0)return false;
}
return true;
}
int main(){
__int64 ans=0;
for(int n=1000*10000;n<2000*10000;n++){
if(isPrime(n)==false)continue;
ans+=calc(n)-sam(n);
}
std::cout<<ans<<"\n";
}
最終更新:2015年03月23日 04:58