結果

問題 No.2847 Birthday Attack
ユーザー kotatsugamekotatsugame
提出日時 2024-08-23 22:01:38
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 461 ms / 3,000 ms
コード長 959 bytes
コンパイル時間 908 ms
コンパイル使用メモリ 74,872 KB
実行使用メモリ 160,608 KB
最終ジャッジ日時 2024-08-23 22:01:47
合計ジャッジ時間 8,957 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 311 ms
160,524 KB
testcase_01 AC 330 ms
160,608 KB
testcase_02 AC 327 ms
160,408 KB
testcase_03 AC 311 ms
160,588 KB
testcase_04 AC 328 ms
160,548 KB
testcase_05 AC 451 ms
160,472 KB
testcase_06 AC 389 ms
160,472 KB
testcase_07 AC 461 ms
160,552 KB
testcase_08 AC 349 ms
160,592 KB
testcase_09 AC 384 ms
160,476 KB
testcase_10 AC 358 ms
160,556 KB
testcase_11 AC 337 ms
160,380 KB
testcase_12 AC 426 ms
160,476 KB
testcase_13 AC 434 ms
160,596 KB
testcase_14 AC 397 ms
160,444 KB
testcase_15 AC 388 ms
160,384 KB
testcase_16 AC 394 ms
160,552 KB
testcase_17 AC 351 ms
160,540 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function 'int main()':
main.cpp:39:17: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
   39 |         for(auto[a,b]:T)
      |                 ^

ソースコード

diff #

#include<iostream>
#include<vector>
#include<algorithm>
#include<cassert>
using namespace std;
int gcd(int a,int b)
{
	while(b)
	{
		int t=a%b;
		a=b;
		b=t;
	}
	return a;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	vector<pair<int,int> >T;
	T.reserve(20138910);
	auto add=[&](int a,int b){
		int mxab=max(a,b);
		for(int k=1;mxab*k<=(int)4e6;k++)T.emplace_back(a*k,b*k);
	};
	for(int m=1;m*m<=(int)6e6;m++)
	{
		for(int n=1;n<m;n++)
		{
			if(n%2&&m%2)continue;
			if(gcd(n,m)!=1)continue;
			add(m*m-n*n,2*m*n);
			add(2*m*n,m*m-n*n);
		}
	}
	int X,Y,M;
	cin>>X>>Y>>M;
	long ans=0;
	for(auto[a,b]:T)
	{
		int lx=a+1,rx=X-a;
		int ly=b+1,ry=Y-b;
		if(lx>rx||ly>ry)continue;
		ans+=(long)(rx-lx+1)*(ry-ly+1)%M;
		if(ans>=M)ans-=M;
	}
	ans=ans*4%M;
	for(int a=1;a+1<=X-a;a++)
	{
		ans+=(long)(X-a-a-1+1)*Y*2%M;
		if(ans>=M)ans-=M;
	}
	for(int b=1;b+1<=Y-b;b++)
	{
		ans+=(long)X*(Y-b-b-1+1)*2%M;
		if(ans>=M)ans-=M;
	}
	cout<<ans<<endl;
}
0