洛谷 P2158 [SDOI2008]仪仗队 && 洛谷 P1447 [NOI2010]能量采集

https://www.luogu.org/problemnew/show/P2158

以人所在位置为(0,0)建立坐标系,

显然除了(0,1)和(1,0)外,可以只在坐标(x,y)的gcd(x,y)==1时统计贡献。。因为如果gcd(x,y)==g而g不等于1,那么会在(x/g,y/g)处统计贡献

1要特判。。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 #define fi first
 7 #define se second
 8 #define mp make_pair
 9 #define pb push_back
10 typedef long long ll;
11 typedef unsigned long long ull;
12 typedef pair<int,int> pii;
13 #define N 100100
14 ll prime[N+100],len,mu[N+100];
15 bool nprime[N+100];
16 ll n,ans;
17 ll F(ll x)    {return (n/x)*(n/x);}
18 int main()
19 {
20     ll i,j;
21     mu[1]=1;
22     for(i=2;i<=N;i++)
23     {
24         if(!nprime[i])    prime[++len]=i,mu[i]=-1;
25         for(j=1;j<=len&&i*prime[j]<=N;j++)
26         {
27             nprime[i*prime[j]]=1;
28             if(i%prime[j]==0)    {mu[i*prime[j]]=0;break;}
29             else    mu[i*prime[j]]=-mu[i];
30         }
31     }
32     scanf("%lld",&n);
33     if(n==1)    {puts("0");return 0;}
34     n--;
35     for(i=1;i<=n;i++)    ans+=mu[i]*F(i);
36     printf("%lld",ans+2);
37     return 0;
38 }

https://www.luogu.org/problemnew/show/P1447

一样的。。。

答案就是$\sum_{i=1}^n\sum_{j=1}^m{(2*gcd(i,j)-1)}$

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 #define fi first
 7 #define se second
 8 #define mp make_pair
 9 #define pb push_back
10 typedef long long ll;
11 typedef unsigned long long ull;
12 typedef pair<int,int> pii;
13 #define N 100000
14 ll prime[N+100],len,mu[N+100];
15 bool nprime[N+100];
16 ll n,m,ans,a2;
17 ll F(ll x)    {return (m/x)*(n/x);}
18 int main()
19 {
20     ll i,j,k;
21     mu[1]=1;
22     for(i=2;i<=N;i++)
23     {
24         if(!nprime[i])    prime[++len]=i,mu[i]=-1;
25         for(j=1;j<=len&&i*prime[j]<=N;j++)
26         {
27             nprime[i*prime[j]]=1;
28             if(i%prime[j]==0)    {mu[i*prime[j]]=0;break;}
29             else    mu[i*prime[j]]=-mu[i];
30         }
31     }
32     scanf("%lld%lld",&n,&m);
33     if(n>m)    swap(n,m);
34     for(k=1;k<=m;k++)
35     {
36         a2=0;
37         for(i=1;i<=m/k;i++)
38             a2+=mu[i]*F(i*k);
39         ans+=a2*k;
40     }
41     printf("%lld",ans*2-n*m);
42     return 0;
43 }

猜你喜欢

转载自www.cnblogs.com/hehe54321/p/9334918.html