Cod sursa(job #935532)

Utilizator dariusdariusMarian Darius dariusdarius Data 3 aprilie 2013 20:27:52
Problema Mins Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int p[10];
vector<int> dp[1000005];
long long pinex(int x,int y)
{
    ///numarul de numere <=x si prime cu y:
    int ans=x,q,nr;
    for(int i=1;i<(1<<(int)dp[y].size());i++)
    {
        nr=0;q=1;
        for(int j=0;j<(int)dp[y].size();j++)
            if(i&(1<<j))
                nr++,q*=dp[y][j];
        if(nr&1) ans-=x/q;
        else ans+=x/q;
    }
    return ans;
}
int main()
{
    freopen("mins.in","r",stdin);
    freopen("mins.out","w",stdout);
    int n,m;long long ans=0;
    scanf("%d%d",&n,&m);
    for(int i=2;i<n;i+=2)
	dp[i].push_back(2);
    for(int i=3;i<n;i+=2)
        if(dp[i].empty())
            for(int j=i;j<n;j=j+i)
                dp[j].push_back(i);
/*
    for(int i=2;i<n;i++)
	{
		for(int j=0;j<(int)dp[i].size();j++)
			fprintf(stderr,"%d ",dp[i][j]);
		fprintf(stderr,"\n");
	}
*/
    for(int i=1;i<n;i++)
        ans+=pinex(m-1,i);
    printf("%lld\n",ans);
    return 0;
}