JZOJ 100027. 【NOIP2017提高A组模拟7.7】表达式

题目

Description

JZOJ 100027. 【NOIP2017提高A组模拟7.7】表达式

Input

一行两个整数k,p。

Output

一行一个整数表示答案。

Sample Input

1 3

Sample Output

6

Data Constraint

对于20%的数:kp<=105k*p<=10^5
对于另外20%的数据k=1。
对于70%的数据:kp<=109k*p<=10^9
对于100%的数据:k,p<=10910^9

题解

方法一

JZOJ 100027. 【NOIP2017提高A组模拟7.7】表达式
JZOJ 100027. 【NOIP2017提高A组模拟7.7】表达式
(内容来源:https://jzoj.net

方法二

p=2p=2,答案为1,0,1,0,1,0,1,0,1,01,0,1,0,1,0,1,0,1,0……
p=3p=3,答案为6,6,0,6,6,0,6,6,06,6,0,6,6,0,6,6,0……
p=5p=5,答案为15,10,10,15,0,15,10,10,15,015,10,10,15,0,15,10,10,15,0……
p=7p=7,答案为28,14,7,7,14,28,0,28,14,7,7,14,28,028,14,7,7,14,28,0,28,14,7,7,14,28,0……
p=11p=11,答案为66,22,110,88,77,77,88,110,22,66,066,22,110,88,77,77,88,110,22,66,0……
……
这样好像看不出什么,但可以发现两点:
1、答案有循环,且每个循环节是回文的,kpk|p时答案为0.
2、p&gt;2p&gt;2时非00的答案为pp的倍数。
那么我们把每个循环节前一半的答案除以pp找出来。
p=3p=322
p=5p=53,23,2
p=7p=74,2,14,2,1
p=11p=116,2,10,8,76,2,10,8,7
p=13p=137,2,11,8,6,57,2,11,8,6,5
p=17p=179,2,13,8,4,1,16,159,2,13,8,4,1,16,15
p=23p=2312,2,16,8,1,18,13,9,6,4,312,2,16,8,1,18,13,9,6,4,3
……
通过观察发现,每一行的第一项为p+12\frac{p+1}{2}
后面的呢?
不难发现(其实很难),每一项为一个公差为11的等差数列的前缀和,再对pp取模。
举例:
p=23p=23,等差数列12,13,14,15,16,17,18,19,20,21,2212,13,14,15,16,17,18,19,20,21,22
p=23p=23,前缀和12,25,39,54,70,87,105,124,144,165,18712,25,39,54,70,87,105,124,144,165,187
p=23p=23,对pp取模后12,2,16,8,1,18,13,9,6,4,312,2,16,8,1,18,13,9,6,4,3
这样就可以快速实现了,注意p=2p=2要特判。

代码

方法二的代码。

#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
	int k,p;
	scanf("%d%d",&k,&p);
	if(p==2)
	{
		printf("%d",k%2);
		return 0;
	}
	k%=p;
	if(k==0)
	{
		printf("0");
		return 0;
	}
	if(k>p/2) k=p-k;
	long long s=(p+1)/2;
	long long t=s+k-1;
	printf("%lld",(s+t)*k/2%p*p);
	return 0;
}

相关文章:

  • 2021-07-07
  • 2022-02-01
  • 2022-12-23
  • 2021-06-28
  • 2021-09-26
  • 2021-10-06
  • 2022-12-23
  • 2021-07-15
猜你喜欢
  • 2021-08-24
  • 2022-12-23
  • 2021-04-26
  • 2021-06-06
  • 2021-10-28
  • 2021-08-12
  • 2021-07-28
相关资源
相似解决方案