Cod sursa(job #1725049)

Utilizator valentin50517Vozian Valentin valentin50517 Data 4 iulie 2016 19:56:00
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<bits/stdc++.h>
using namespace std;
int A[2][5000100];
int f(int n,int p,bool t){return A[t][n];}
int main(){
	ifstream cin("pascal.in");
    ofstream cout("pascal.out");
	int N,D,rs = 0;
	cin>>N>>D;
	if(D == 6){
		for(int p = 2;p<=N;p*=2)
			for(int j = p;j<=N;j+=p) A[0][j]++;
			
		for(int p = 3;p<=N;p*=3)
			for(int j = p;j<=N;j+=p) A[1][j]++;
		
		
		for(int i = 2;i<=N;i++) A[0][i] += A[0][i-1],A[1][i] += A[1][i-1];
		
		int d1n = f(N,2,0),d2n = f(N,3,1),d1,d2,i = 1;
		for(;i<(N+1)/2;i++){
			d1 = f(N-i,2,0)+f(i,2,0);
			d2 = f(N-i,3,1)+f(i,3,1);
			if(min(d1n-d1,d2n-d2) >= 1) rs++;
		}
		rs*=2;
		if(N%2 == 0){
			d1 = f(N-i,2,0)+f(i,2,0);
			d2 = f(N-i,3,1)+f(i,3,1);
			if(min(d1n-d1,d2n-d2) >= 1) rs++;
		}
	}else{
		bool p = D==4;
		if(p) D = 2;
		for(int p = D;p<=N;p*=D)
			for(int j = p;j<=N;j+=p) A[0][j]++;
		for(int i = 2;i<=N;i++) A[0][i] += A[0][i-1];
		int dn = f(N,D,0),d,i=1;
		for(;i<(N+1)/2;i++){
			d = f(N-i,D,0) + f(i,D,0);
			rs+=((p && dn-d >= 2) || (!p && dn-d >= 1) ? 1 : 0);
		}
		rs*=2;
		if(N%2 ==0){
			d = f(N-i,D,0) + f(i,D,0);
			rs+=((p && dn-d >= 2) || (!p && dn-d >= 1) ? 1 : 0);
		}
	}
	cout << rs << '\n'; 
	
    return 0;
}