题目:Problem A. Arithmetic Derivative
Input file: standard input
Output file: standard input
Time limit: 1 second
Memory limit: 256 mebibytes
Lets define an arithmetic derivative:
• if p = 1 then p0 = 0;
• if p is prime then p0 = 1;
• if p is not prime then n0 = (a · b)0 = a0 · b + a · b0.
For example, 60 = (2 · 3)0 = 20 · 3 + 2 · 30 = 5.
Given positive integers k and r, find all positive integers n such as n ≤ r and n0 = k · n.
Input
Input contains two integers k and r (1 ≤ k ≤ 30; 1 ≤ r ≤ 2 · 1018).
Output
If there are no such numbers, print 0. Otherwise in first line print m — number of positive integers n does
not exceeding r, for which n0 = k · n. Second line then must contain those m integers in ascending order.
Examples
standard input | standard input |
1 100 | 2 4 27 |
1 2 | 0 |
1 #include<iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 long long num[10]={0,4,27,3125,823543,285311670611,302875106592253}; 7 8 long long k,r,ans; 9 10 vector<long long> v; 11 12 void dfs(int x,long long nownum,long long r) 13 { 14 if(x>6) 15 { 16 if(r) 17 return ; 18 if(nownum<=k) 19 { 20 ans++; 21 v.push_back(nownum); 22 } 23 return ; 24 } 25 long long nn=1; 26 for(int i=0;i<=r;i++) 27 { 28 if(i==0) 29 dfs(x+1,nownum,r); 30 else 31 { 32 if(k/nn<num[x]) 33 break; 34 else 35 nn*=num[x]; 36 if(k/nownum<nn) 37 break; 38 dfs(x+1,nownum*nn,r-i); 39 } 40 } 41 return ; 42 } 43 44 int main() 45 { 46 cin>>r>>k; 47 if(r==1) 48 { 49 for(int i=1;i<=6;i++) 50 if(num[i]<=k) 51 ans++; 52 cout<<ans<<endl; 53 for(int i=1;i<=ans;i++) 54 cout<<num[i]<<' '; 55 return 0; 56 } 57 dfs(1,1,r); 58 cout<<ans<<endl; 59 sort(v.begin(),v.end()); 60 for(int i=0;i<ans;i++) 61 cout<<v[i]<<' '; 62 return 0; 63 }