fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. int L,R,K,ans;
  5. bool f[30],ps[200];
  6. int p[20];
  7. bool pr(int n)
  8. {
  9. if(n<2)return 0;
  10. for(int i=2;i*i<=n;i++)if(n%i==0)return 0;
  11. return 1;
  12. }
  13. void dfs(int n,int pos,int u,int v,int x,int s,int pd)
  14. {
  15. if(pos==(n+1)/2){
  16. int cur=x,sm=s,prd=pd,tmp=x;
  17. if(n%2)tmp/=10;
  18. while(tmp){
  19. int d=tmp%10;
  20. cur=cur*10+d;sm+=d;prd=(prd*d)%K;
  21. tmp/=10;
  22. }
  23. if(cur>=L&&cur<=R&&ps[sm]&&prd==0){
  24. if(n>=3&&!f[cur%10+(cur/10)%10+(cur/100)%10])return;
  25. ans++;
  26. }
  27. return;
  28. }
  29. for(int d=(pos==0);d<=9;d++){
  30. if(pos>0&&d==u)continue;
  31. if(pos>=2&&!f[v+u+d])continue;
  32. dfs(n,pos+1,d,u,x*10+d,s+d,(pd*d)%K);
  33. }
  34. }
  35. signed main()
  36. {
  37. cin.tie(nullptr)->sync_with_stdio(false);
  38. for(int x:{0,1,2,3,5,8,13,21})f[x]=1;
  39. for(int i=2;i<200;i++)if(pr(i))ps[i]=1;
  40. p[0]=1;
  41. for(int i=1;i<=18;i++)p[i]=p[i-1]*10;
  42. if(!(cin>>L>>R>>K))return 0;
  43. for(int i=1;i<=18;i++){
  44. if(p[i-1]>R)break;
  45. if(p[i]-1<L)continue;
  46. dfs(i,0,-1,-1,0,0,1);
  47. }
  48. cout<<ans<<"\n";
  49. }
Success #stdin #stdout 0.01s 5316KB
stdin
Standard input is empty
stdout
Standard output is empty