【内测版】思维专项 1.0 Task O
一句话题解
LJ24TangHaoLong「唐浩滝」
题面:
求a, b, c不大于n且满足a+b, b+c, a+c为k倍数的三元组(a, b, c)的个数
原题:
AtCoder Regular Contest 102 Task C
思路1:
暴力模拟,三重for循环遍历所有情况挨个判断(
结果很显然
思路2:
由条件2,考虑同余定理
推出a+b=m1*kb+c=m2*ka+c=m3*k→r=m*k2(r=a,b,c)
因此若k为奇,则r必是k/2或k的倍数,ans为nk3;若k为偶,则r必是k的倍数,ans多出一种情况即a≡k2
(mod k)。当r为k/2的倍数时,只能和k/2的倍数组合。
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- ll n,m,ev,od;
- signed main()
- {
- ios::sync_with_stdio(0),std::cin.tie(0),std::cout.tie(0);
- cin>>n>>m;
- for(ll i=1;i<=n*2;i++)
- {
- if(i*m%2==1)continue;
- if(i*m/2>n)break;
- if(i*m/2%m==0)ev++;
- else od++;
- }
- cout<<ev*ev*ev+od*od*od;
- }
以上为参考代码
大成功!